Regular Expressions
Regex Fallstricke
Suche…
Warum stimmt der Punkt (.) Nicht mit dem Zeilenvorschubzeichen ("\ n") überein?
.*
in Regex bedeutet im Grunde " alles bis zum Ende der Eingabe fangen".
Also, für einfache Saiten, wie hello world
, funktioniert .*
perfekt. Wenn Sie jedoch eine Zeichenfolge haben, die z. B. Zeilen in einer Datei darstellt, werden diese Zeilen durch ein Trennzeichen getrennt , z. B. \n
(Newline) auf Unix-ähnlichen Systemen und \r\n
(Wagenrücklauf und Newline) Windows.
In den meisten Regex-Engines ist .
stimmt nicht mit Zeilenumbrüchen überein, so dass die Übereinstimmung am Ende jeder logischen Zeile endet. Wenn Sie wollen .
Um wirklich alles, einschließlich der Zeilenumbrüche, zu finden, müssen Sie den Modus "dot-matches-all" in Ihrer re.DOTALL
Engine re.DOTALL
(beispielsweise re.DOTALL
Flag in Python oder /s
in PCRE).
Warum überspringt ein Regex einige schließende Klammern und passt sie danach an?
Betrachten Sie dieses Beispiel:
Er ging in das Café "Dostoevski" und sagte: "Guten Abend."
Hier haben wir zwei Sätze von Zitaten. Nehmen wir an, wir wollen beide zusammenbringen, so dass unsere Regex-Matches bei "Dostoevski"
und "Good evening."
übereinstimmen "Good evening."
Zunächst könnten Sie versucht sein, es einfach zu halten:
".*" # matches a quote, then any characters until the next quote
Aber es funktioniert nicht: Es stimmt mit dem ersten Zitat in "Dostoevski"
und bis zum Schlusszitat in "Good evening."
überein "Good evening."
, einschließlich der and said:
Teil. Regex101-Demo
Warum ist das passiert?
Dies geschieht, weil die Regex-Engine, wenn sie auf .*
Stößt, die gesamte Eingabe bis zum Ende "frisst". Dann muss es mit dem Finale übereinstimmen "
. Es wird also vom Ende des Matches "
und der übereinstimmende Text losgelassen, bis das erste "
gefunden "
ist - und es ist natürlich das letzte "
im Match , am Ende von "Good evening."
Teil.
Wie kann man dies verhindern und genau auf die ersten Zitate passen?
Verwenden Sie [^"]*
. Es frisst nicht alle Eingaben - nur bis zum ersten "
, genauso wie es benötigt wird. Regex101-Demo