Heim >Web-Frontend >js-Tutorial >Warum stimmt das Multiline-Flag (/m/) von JavaScript nicht mit Zeilenumbrüchen in regulären Ausdrücken überein?
Mehrzeilige Textextraktion mit regulären Ausdrücken in JavaScript
In HTML ist es oft notwendig, Informationen aus Tags zu extrahieren. Eine Möglichkeit hierfür sind reguläre Ausdrücke. Allerdings funktioniert das mehrzeilige Flag (/m/) von JavaScript möglicherweise nicht immer wie erwartet.
Betrachten Sie den folgenden regulären Ausdruck, der darauf abzielt, den Text zwischen h1-Tags in einer HTML-Zeichenfolge zu extrahieren:
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi m = html.search(pattern); return m[1];
Wenn diese Regex auf Zeilenumbrüche (n) innerhalb der Zeichenfolge stößt, gibt sie möglicherweise Null zurück. Durch das Entfernen der Zeilenumbrüche wird dieses Problem behoben, was darauf hindeutet, dass sich das Flag /m/ nicht wie erwartet verhält.
Die Lösung: Der Modifikator /s/ (Dotall)
Der Das Flag /m/ ändert das Verhalten der Zeichen ^ und $, nicht des . Daher liegt das Problem bei der . Charakter. JavaScript stellt den Modifikator /.../s (auch als Dotall-Modifikator bekannt) nicht bereit.
Problemumgehung
Um dies zu mildern, können JavaScript-Entwickler ein Zeichen verwenden Klasse (z. B. s) und ihre Negation (S) zusammen, also:
[\s\S]
Die Einbindung in den ursprünglichen regulären Ausdruck ergibt Folgendes:
/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i
Dieser Ausdruck sollte erfolgreich extrahiert werden den gewünschten Text aus der HTML-Zeichenfolge, auch wenn Zeilenumbrüche vorhanden sind.
ES2018-Update
Seit ES2018 hat JavaScript das Flag s (dotAll) eingeführt, das dies ermöglicht Die . passend zu Zeilenumbrüchen. Dadurch entfällt die Notwendigkeit von Workarounds. Der aktualisierte reguläre Ausdruck würde so aussehen:
/<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/is
Diese Änderung stellt die Kompatibilität mit modernen JavaScript-Umgebungen sicher, in denen das s-Flag unterstützt wird.
Das obige ist der detaillierte Inhalt vonWarum stimmt das Multiline-Flag (/m/) von JavaScript nicht mit Zeilenumbrüchen in regulären Ausdrücken überein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!