2011-01-24 24 views
5

takıldım garip davranışları. Neden bu kodda grup path değeri 2/3/4 değil 1/2/3/4 var? 1/ nereye gitti? İfadenin hangi kısmı 1/ ile eşleşiyor? Yol grubu için iki yakalar, sen olduğuna göre oldukça, anlamıyorum "1" ve "2/3/4" (o grup [için nicelik sağlanması ve sıfır söyleyerek veya olmasın sıfır veya bir söyleyerek vardırRegexes (NET lehçesi): Bir yakalama grubu

var re = new Regex(@"^-/?(?'folder'((?'path'.+?)/)??[^/]*)/?$"); 
var m = re.Match("-1/2/3/4/5"); 
m.Groups["folder"].Value.Dump("Folder"); 
m.Groups["path"].Value.Dump("Path"); 
+0

Bu için "1/2/3/4/5" ardından "1/2/3/4" Benim için ... –

+0

@Jon Skeet, bu '' "2/3/4" Beni veriyor döker Yol, çok – bdukes

+0

İşte LINQPad bir ekran görüntüsü: http://screencast.com/t/dfnJyMLQi9 – thorn

cevap

5

bu .NET 3.5 ve 4.0 arasında bir davranış fark gibi olduğunu] etrafındaki numaralı yakalama grubuna) için bir görünüyor.

Folder: 1/2/3/4/5 
Path: 2/3/4 

Derleyen ve .NET 4 altında çalıştırın::

using System; 
using System.Text.RegularExpressions; 

class Test 
{ 
    static void Main() 
    { 
     var re = new Regex(@"^-/?(?'folder'((?'path'.+?)/)??[^/]*)/?$"); 
     var m = re.Match("-1/2/3/4/5"); 
     Console.WriteLine("Folder: " + m.Groups["folder"].Value); 
     Console.WriteLine("Path: " + m.Groups["path"].Value); 
    } 
} 

Derleyen ve .NET 3.5 altında çalıştırın: İşte tam program

Folder: 1/2/3/4/5 
Path: 1/2/3/4 

bilmiyorum neden davranış ... gerçi

EDIT değişebilir olmalıdır: Ben .NET 3.5 altında ... Bu biraz daha ileri inceledik grup oluşur iki yakalama: "1" ve "2/3/4". .NET 4 altında tek yakalama "1/2/3/4".

+6

Sen bilmiyorum * ?? * incredulous * :) –

+0

Kesinlikle bir hata düzeltmesi gibi görünüyor ... – bdukes

0

deseniniz ilgili garip şey yol grubundan sonra ?? kullanılmasıdır. Neden sadece ?'u kullanmıyorsunuz? Bu meta karakter, önceki öğeyi isteğe bağlı yapar ve mümkünse maçta hariç tutulur.

@"^-/?(?'folder'((?'path'.+?)/)??[^/]*)/?$" 
           ^
       remove this __| 

Yeni model: @"^-/?(?'folder'((?'path'.+?)/)?[^/]*)/?$"

bu istenen sonucu verir .NET 3.5 altında derlenmiştir. .NET 4.0 altında, desendeki davranış, Jon pointed out olarak davranıştaki bir farkı gösterir.

+0

Ahmad, bu karakter olmadan "-/16 /" 'gibi dizeler için geçersiz sonuçlar alıyorum. Bu durumda '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dizesinin boş dizge olmasını istiyorum – thorn

+0

@thorn anladı ... Bu durumda, .NET 4.0 davranışı bu sorunu ele alıyor görünüyor. –

+0

BTW, son sürümüm:^^ /? (? 'Klasör' ((? 'Yol'. +)/(?! $))? [^ /] *) /? $ ' – thorn