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
Freigeben: 2024-11-08 08:00:02
Original
910 Leute haben es durchsucht

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];
Nach dem Login kopieren

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]
Nach dem Login kopieren

Die Einbindung in den ursprünglichen regulären Ausdruck ergibt Folgendes:

/<div class="box-content-5">[\s\S]*<h1>([^<]+?)<\/h1>/i
Nach dem Login kopieren

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage