Perl : Regex das erste klammernpaar auswählen

...komplette Frage anzeigen

2 Antworten

Dein Fehler ist dass du die Klammern nicht escapest. Runde Klammern haben in Regulären Ausdrücken eine besondere Bedeutung.

\(.+\)

damit also. Allerdings gibt es noch ein weiteres Problem. Quantifier in Regex, hier dein Plus, sind standardmäßig "gierig", d.h. sie versuchen so viele Zeichen wie möglich zu matchen. Daher würde das Regex oben aus deiner Beispiel-Zeichenkette:

-2x - (-20 + 2x) + 2(x - 1) = -4

das hier matchen:

(-20 + 2x) + 2(x - 1)

Du musst daher deine Regeln für das innerhalb der Klammern umformulieren. Entweder (bei Regex-Engines die das unterstützen) du machst den Quantifier direkt nicht-gierig mit .+? oder aber du formulierst deine Zeichenklasse dafür um [^\)]+, wobei allerdings beide Lösungen mit weiteren Klammerpaaren innerhalb des ersten Klammerpaares nicht mehr zurecht kommen. Hier wirst du das ganze noch etwas komplexer machen müssen:

(\((?:[^\(\)]|(?:\([^\(\)]+\)))+\))

Dieser Ausdruck hier würde auch noch bei einer weiteren Klammerschachtelung funktionieren wie z.B. bei so etwas:

-2x - (-20 + (4x - 1)) + 2(x - 1) = -4

Entsprechend umfangreicher / komplexer wird es, wenn du eine noch tiefere Schachtelung ermöglichen willst. Hier bietet es sich an mehrere Teil-Regexe zu formulieren und diese dann dynamisch zusammenzusetzen, so sparst du dir einiges an Arbeit.

Jusytaina 12.03.2014, 13:19

Oh oha, danke für die ausführliche antwort! wenn ich etwas erfahrener mit perl bin, versuche ich mal die komplexere lösung, aber soweit reicht mir der einfachere Teil! Vielen Dank (:

0
nex4k 12.03.2014, 13:25
@Jusytaina

Das hat nicht mehr wirklich was mit Perl zu tun, sondern nur noch mit Regulären Ausdrücken ;)

Buchtipp: "Mastering Regular Expressions" von Jeffrey Friedl. Geniales Ding - wusste zwar vorher schon so die Basics wie man Regexes schreibt, aber dieses Buch hat mir so einiges gezeigt was ich nicht wusste und was wirklich gut zu wissen ist, wenn man plant mehr mit Regexes zu machen. Das hier war eine dieser Sachen ;)

1

Versuch's mal mit

(.+?)  (ungetestet, nur auf die Schnelle)

Regex sind "gierig" eingestellt, nehmen die größtmögliche Menge mit. Daher erfüllt Deine Abfrage diejenige bis zur 2. schließenden Klammer. Einfach mal nach Regex greedy oder Regex gierig suchen. Das verhilft zur Lösung

Michael339 12.03.2014, 13:09

um genauer zu sein:

\(.+?\)
1
Jusytaina 12.03.2014, 13:16

Oh meine rettung! Vielen Dank! So klappt das! (:

0

Was möchtest Du wissen?