weil regex so schön sind: Zeichen ausschließen, aber nur eins, nicht zwei gleiche hintereinander
-
Kurz und bündig hier mein Text:
TEXT TEXT TEXT TEXT {{Vorlage:Code|var1=Text ohne geschweifte Klammern}} TEXT TEXT TEXT TEXT TEXT TEXT TEXT TEXT {{Vorlage:Code|var1=Text mit geschweiften Klammern(}) }} TEXT TEXT TEXT TEXTTEXT TEXT TEXT
Hier meine bisherige Regex, die fast alles richtig macht:
(\{\{)([^\}]*)(\}\})
Gefunden werden sollen die Textabschnitte, welche von den doppelten geschweiften Klammern eingeschlossen sind. Das funktioniert solange, wie keine geschlossene einzelne geschweifte Klammer innerhalb dieses Bereiches vorkommt.
Hat ein regex-Guru Ahnung, wie man auch den zweiten Suchstring finden kann?Erst als letzten Schritt verzichte ich auf regex und cutte den Text manuell :xmas1:
-
Einfach den mittleren Teil non-greedy matchen:
\{\{(.*?)\}\}
-
oh mann ... das Fragezeichen. Ich hatte sowas in der Art auch schon, aber er hat zuviel markiert. Das Fragezeichen ist die Lösung. :xmas2:
-
BasicMan01 schrieb:
Erst als letzten Schritt verzichte ich auf regex und cutte den Text manuell
Dieses Fragezeichen ist bei Regexen sehr langsam. Wenn du schon selber cuttest, dann cutte doch den ganzen string selber. Dürfte um einiges schneller sein.
-
kutter schrieb:
Dieses Fragezeichen ist bei Regexen sehr langsam. Wenn du schon selber cuttest, dann cutte doch den ganzen string selber. Dürfte um einiges schneller sein.
Danke für die Info. Hab daraufhin mal gegoogelt und bin darauf gestoßen: http://blog.stevenlevithan.com/archives/greedy-lazy-performance. Sehr interessant. Man sollte also bei jeder Regex wirklich überlegen, ob man es nicht auch greedy lösen kann, da das performanter ist.
-
Warum nicht einfach von vorne und hinten die ersten Klammern suchen, ist auf jeden fall schneller als regex