2013-08-06 25 views
5

Küçük bir betik ayrıştırıcısının uygulanmasında, bu örnek kodla ilgili bir problemle karşılaştım - sadece "if {}" ifadeleriyle arasındaki ve sadece "if {}" deyimleri dahil olmak üzere bir bölüm seçmek isteyenler açgözlü olmak ve son satırı da dahil olmak üzere hepsini seçmek. Sanırım kullanmam gereken olumsuz bir bakış.C# RegEx, aynı desenle açgözlü eşleşmeyi önledi

if [condition1] 
{ 
    task1 
    setparameters{a} 
    task2 
} 

if [condition2] 
{ 
    task3 
} 

setparameters{b} 

Şu anda, var:

if\b\s\[.*\]\s\{(\s|.)*\} 

Ben 'eğer' Başka ya bir şey olarak başka daha önce gelebilir üzerinde kırma kadar basit değilmiş. Eşit sayıda açılış ve kapanış parantezleri saymak mümkün mü? Ya da bu 'if' ifadelerinden birini seçebileceğim başka bir büyülü yol var mı?

+1

Regex'te '?' Ve önemini öğrenmelisiniz. Düzeltme: 'if \ b \ s \ [. * \] \ S \ {(\ s |.) *? \}' –

+0

Belki de neden yapmadığımı biraz daha fazla nitelendirmeliydim * açgözlü olmayan - döngü içinde bir kapanış ayracı} görünebilir. Bunu göstermek için orijinali güncelledim. –

+0

Ah, o zaman dengeleme gruplarına bakmaya başlıyorsunuz. Ne olduklarını bilmiyordum, bu yüzden bir soru yayınladım. Cevap harika. Okuyun: [Normal İfade Dengeleme Grupları nedir?] (Http://stackoverflow.com/questions/17003799/What-are-regular-expression-balancing-groups) –

cevap

2

: \[.+?]

It'sNotALie (aktarılan) sözü @ gibi

, sen açıklama biraz yararlanacak SQL dizgileri (kaçan alıntı olasılığıyla) tespit etmeye çalışırken benzer bir soruna rastladım, normal ifadeyi deneyin: if.*?\{(\{.*?\}|[^}])*+\}

Bir if ile eşleşecek 01 o da son kapanış } ardından bir { ve }VEYA } değil şey arasında bir şeyler , karşılaşırsa eşleşen devam edecek o zaman o andan itibaren ilk { kadar.

Katastrofik geri dönüş olasılığını önlemek için iyelik ölçütünü kullandım.