Heim >Web-Frontend >js-Tutorial >Warum stimmt das Multiline-Flag (/m/) von JavaScript nicht mit Zeilenumbrüchen in regulären Ausdrücken überein?

Warum stimmt das Multiline-Flag (/m/) von JavaScript nicht mit Zeilenumbrüchen in regulären Ausdrücken überein?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-08 08:00:02855Durchsuche

Why Does JavaScript's Multiline Flag (/m/) Fail to Match Newlines in Regular Expressions?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn