2010-11-19 15 views
1

Ich schreibe einen Code-Formatierer und ich brauche etwas Hilfe. Ich muss die Codeblöcke finden und ich möchte reguläre Ausdrücke verwenden. Der Code, den ich zu Format benötigen sieht grundsätzlich wie folgt:RegEx, um verschachtelte Code-Blöcke zu finden

KEYWORD name { 
    word 
    word 
    ... 
} 

Ich bin in der Lage, die Blöcke zu finden, die mit {und endet mit} mit diesem Ausdruck starten:

[{](.*?)[}] 

Aber ich weiß nicht, wie man den Teil zum Ausdruck hinzufügt. Beides sind benutzerdefinierte Zeichenfolgen, die ein beliebiges Zeichen außer ;, { und } enthalten können.

Ein anderes Problem ist, dass meine Code-Blöcke geschachtelt werden können. Ich weiß nicht, wie ich diese Funktion hinzufügen soll.

+0

Ich weiß nicht, ob Ihre Code-Blöcke verschachtelt werden können, aber wenn ja, wird Ihre Regex nicht funktionieren. – Jordi

+0

Oh! Sie haben Recht! Das habe ich noch nicht getestet. Aber sie müssen verschachtelt sein ... –

+0

Sobald das Verschachteln (in beliebige Tiefen) involviert ist, werden Regexes schwierig zu verwenden. Streng genommen sind verschachtelte Konstrukte nicht regulär und daher für die Zuordnung zu regulären Ausdrücken ungeeignet. Einige moderne Regex-Varianten (z. B. PCRE, Perl, .NET) ermöglichen rekursives Matching, jedoch gehört Java nicht dazu. Sie müssen wahrscheinlich einen Parser für diesen Job erstellen/verwenden. –

Antwort

3

Sie können einfach tun:

KEYWORD name {.*?} 

Da Sie die . wollen Newline passen auch erhalten Sie die Multiline-Modus verwenden.

Da sowohl KEYWORD und name sind beliebige Zeichenfolgen, die alle Zeichen außer ;,{ und } enthalten: (.? +)

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

Ja! Das funktioniert gut! –

2

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

Dies ist: Alles, was kein Leerzeichen ist, gefolgt von einem oder mehreren Leerzeichen, gefolgt von allem, was kein Leerzeichen ist, einem oder mehreren Leerzeichen und Ihrem Codeblock.

Wenn das Schlüsselwort nur Großbuchstaben und die name enthalten kann, sagen wir, alle Buchstaben, Ziffern und Unterstrichen, sollte es so aussehen:

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

Beachten Sie, dass, wenn Ihr Code-Blöcke können verschachtelt werden, Sie‘ Ich habe Probleme mit dieser Regex, da es sowohl die erste {als auch die erste} trifft.

+0

Danke, es funktioniert. Aber die Blöcke sind manchmal verschachtelt. Ich dachte, ich benutze Regex, um es schnell zu erledigen ... :-( –

Verwandte Themen