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