Reguläre Ausdrücke

Goldfish

Bekanntes Mitglied
Okay, ich hab hier vor kurzem einen Thread gefunen gehabt, in dem reguläre Ausdrücke vorgeschlagen wurde, von denen ich bislang nicht viel ahnung hatte, weshalb ich mich gleich mal versucht hatte , schlau zu machen. Ich hab schon ganz gut davon profitiert, hänge jedoch noch an einigen Stellen fest.

1. Mir fällt keine Möglichkeit ein, so etwas aus einem String mit einem regulären Ausdruck herauszufiltern

blablabla (x == 29 && (y == 30 || y == 2) ) bla bla bla

Gibt es eine Möglichkeit die gesamte äußere Klammer mit einem regulären Ausdruck zu filtern?


2. Egal wieviel ich damit rumprobiere und wie oft ich die Beschreibung lese, ich schnall einfach nicht, wie greedy, reluctant und possessive Ausdrücke arbeiten... wäre super, wenn mir das vielleicht jemand in anderen Worten erklären könnte als hier
Quantifiers (The Java™ Tutorials > Essential Classes > Regular Expressions)

Edit: Kleine Änderung. Die Greedy sind mir bewusst und mit denen arbeite ich auch hauptsächlich, aber die anderen beiden begreif ich nicht

Danke im Voraus schonmal
 
Diese Begriffe beschreiben die Implementierungsdetails, also wie der Regex-Parser intern arbeitet. Für deren genaue Funktionsweise siehe hier: regex - Greedy vs. Reluctant vs. Possessive Quantifiers - Stack Overflow

Das Problem an den Begrifflichkeiten ist, dass sie mehr oder weniger damit zu tun haben wie Regex intern geparst werden, was dem Anwender aber eigentlich egal sein sollte. Die meisten Regex-Parser sind - gelinde gesagt - äußert fragwürdig implementiert sind (sie setzen massiv Backtracking ein) und haben somit in bestimmten Fällen leider eine exponentielle Laufzeit. Kann man das anhand vom Regex erkennen und beheben spart man sich viel Zeit bei der Ausführung (z.T ist das sogar so schlimm, dass der Parser nicht mehr terminiert, weil die Abarbeitung einfach zu lange dauert).

Es gibt Algorithmen, die diese Laufzeitprobleme nicht haben und bei denen eine Unterscheidung nach den gefragten Begriffen nicht nötig ist, da sie immer optimal arbeiten (sogenannte DFA) und man jederzeit die Resultate auf die eigenen Bedürfnisse anpassen kann. Nur leider ist dieses Wissen noch nicht bei denen angekommen, die die Regex-Parser geschrieben haben, weshalb wir mit diesen "dummen" Implementierungen leben müssen.
 
Zuletzt bearbeitet:
Mal zu deinem Beispiel:
Grundsätzlich wüsste ich nicht, wie das mit Regex möglich sein sollte. Du kannst mit Regex Muster im Text erkennen und diese dann auf einen Text anwenden. Was du vorhast, ist eher eine Art parsen. Ich sage dir, warum das mit Regex wahrscheinlich nicht machbar ist:

Mit äußerer Klammer willst du den gesamten Bereich finden, der davon eingeschlossen ist. Das geht nicht ohne Weiteres, denn wenn eine neue offene Klammer kommt, muss erst diese geschlossen werden usw. Es gibt dafür eine Methode: Du iterierst über den String und merkst dir eine Zahl, die bei 0 anfängt - wenn dein Iterator auf eine offene Klammer stößt, wird diese Zahl um 1 erhöht - bei einer geschlossenen Klammer um 1 verkleinert. Sobald diese Zahl den Wert 0 annimmt (und 1 Klammerpaar gefunden wurde), wird dieser Bereich gespeichert. Das ähnelt eher einem Parser, mit Regex ist das leider nicht zu machen.

Jetzt stellen sich aber noch Fragen wie, was wird gemacht, wenn es sich um
Code:
blabla ( if (x == y && "(hallo" == "(welt"  ) ) blabla
handelt? Werden diese Klammern ignoriert? Wenn ja, wie? etc. etc. etc.

Wie du siehst, ist das schon ein etwas heikleres Thema. Vergiss am besten Regex für dein Vorhaben.
 

Neue Themen


Zurück
Oben