2010-11-19 17 views
1

Bir kod biçimlendirici yazıyorum ve biraz yardıma ihtiyacım var. Kod bloklarını bulmalıyım ve düzenli ifadeler kullanmak istiyorum. Ben biçimine ihtiyaç kod temelde böyle görünür:İç içe geçmiş Kod Bloklarını bulmak için RegEx

ile başlamak blokları bulmak {bittiğini} Bu ifade ile am güçlü
KEYWORD name { 
    word 
    word 
    ... 
} 

:

[{](.*?)[}] 

Ama bilmiyorum İfadeye "KEYWORD name" bölümünün nasıl eklenir. Her ikisi de ;, { ve } dışındaki herhangi bir karakteri içerebilen özel dizelerdir.

Başka bir sorun, kod bloklarımın yuvalanabilmesidir. Bu özelliği nasıl ekleyeceğimi bilmiyorum.

+0

Kod bloklarınızın iç içe geçip içilmeyeceğini bilmiyorum, ancak eğer varsa, normal ifadeniz çalışmayacaktır. – Jordi

+0

Oh! Haklısın! Bunu henüz test etmedim. Ama iç içe olmalılar ... –

+0

Yuvalama (keyfi derinliklere) dahil edilir edilmez, regex kullanımı zorlaşır. Kesin olarak, iç içe geçmiş yapılar düzenli değildir ve bu nedenle düzenli ifadelerle eşleşmek için uygun değildir. Bazı modern regex tatları (örn. PCRE, Perl, .NET) yinelemeli eşleştirmeyi mümkün kılar, ancak Java bunlardan değildir. Bu yüzden muhtemelen bu iş için bir çözümleyici oluşturmalı/kullanmalısınız. –

cevap

3

Sen tıpkı yapabilirsiniz:

KEYWORD name {.*?} 

Eğer . yeni satır eşleşecek yanı çoklu hat modunu kullanmak gerekecek istediğim için.

KEYWORD hem yana ve name;,{ ve } dışındaki tüm karakterler içerebilir keyfi dizeleri şunlardır: (.? +)

[^;,{}]+\s+[^;,{}]+\s*{.*?} 
+0

Evet! Bu iyi çalışıyor! –

2

\ s + \ s + {(* (+.?).? }}

Şöyle: Bir boşluk değil, bir veya daha fazla boşluk karakteri, ardından boşluk olmayan bir şey, bir veya daha fazla boşluk karakteri ve kod bloğunuz.

ANAHTAR KELİME sadece bu gibi görünmelidir, hep harf, rakam ve alt diyelim, büyük harf ve name içerebilir ise:

([A-Z]+?)\s+([A-Za-z0-9_+?)\s+\{(.*?)\} 

Not senin kod blokları iç içe geçebilir, sen' Bu regex ile ilgili sorunlarınız olacaktır, çünkü hem ilk {hem de ilk} ile eşleşecektir.

+0

Teşekkür ederim, işe yarıyor. Ama bloklar bazen iç içe. Hızlıca bitirmek için regex kullanıyorum ... :-( –

İlgili konular