Heim  >  Artikel  >  Web-Frontend  >  JavaScript-Regex verfügt auch über einen einzeiligen Modus

JavaScript-Regex verfügt auch über einen einzeiligen Modus

小云云
小云云Original
2017-12-09 11:27:571034Durchsuche

In diesem Artikel werden hauptsächlich das reguläre JavaScript und der Single-Line-Modus vorgestellt. Freunde, die es benötigen, können darauf zurückgreifen.

Reguläre Ausdrücke wurden erstmals 1970 von Ken Thompson in seinem verbesserten QED-Editor implementiert. Das damals einfachste Metazeichen „.“ in regulären Ausdrücken passte zu allem außer Zeilenumbrüchen:

“. „ ist ein regulärer Ausdruck, der mit jedem Zeichen außer 5563c1593a3ac6eb1677af49676ec1ed übereinstimmt.

Der obige Satz stammt aus dem offiziellen Dokument von QED aus dem Jahr 1970, das möglicherweise das erste reguläre A-Dokument ist.

Warum gibt es eine solche Regel? Dies liegt daran, dass QED Dateien in Zeileneinheiten bearbeitet und das Newline-Zeichen am Ende der Zeile auch im Inhalt dieser Zeile enthalten ist. Wenn Sie beispielsweise alle einzeiligen Kommentare in einem Codeabschnitt löschen möchten, können Sie in QED den folgenden Befehl verwenden:

1,$s#//.*##

If „.“ Wenn ein Zeilenumbruchzeichen übereinstimmt, wird auch das Zeilenumbruchzeichen gelöscht, was dazu führt, dass diese Zeilen mit der nächsten Zeile zusammengeführt werden. Dies ist normalerweise nicht das gewünschte Ergebnis Übereinstimmung mit Zeilenumbruchzeichen, als es zum ersten Mal erfunden wurde. Obwohl es auf dem aktuellen Betriebssystem keinen QED-Befehl zum Testen gibt, haben wir immer noch VIM, und das „.“ in VIM kann aus demselben Grund nicht mit dem Zeilenumbruchzeichen übereinstimmen.

Anders als in Node, wo das Lesen einer Datei normalerweise das Lesen der gesamten Datei auf einmal bedeutet, erbt Perl die Tradition, Dateien Zeile für Zeile mit vielen Linux-Befehlen zu lesen, wie folgt:

while (a8093152e673feb7aba1828c43532094) {print $_}

_ hat auch ein Newline-Zeichen am Ende, daher erbt Perl natürlich die QED-Regel, die nicht mit Newline-Zeichen übereinstimmt. Aber Perl ist schließlich eine Programmiersprache und kein Editor. Die Objekte, mit denen seine regulären Ausdrücke übereinstimmen müssen, sind nicht nur einzelne Textzeilen, sondern können auch mehrzeilige Texte sein eine Voraussetzung für den zeilenübergreifenden Abgleich. Daher hat Perl den regulären Einzelzeilenmodus /s erfunden, der es ermöglicht, auch Zeilenumbrüche abzugleichen.

Die offizielle Beschreibung des /s-Modifikators in Perl, der zum Aktivieren des Einzelzeilenmodus verwendet wird, lautet „Behandle die Zeichenfolge als einzelne Zeile“. Diese „einzelne Zeile“ sollte so verstanden werden: „kann nur übereinstimmen.“ Im Normalmodus können sich Inline-Zeichen nicht über mehrere Zeilen erstrecken; im Einzelzeilenmodus gibt Perl vor, mehrzeilige Zeichenfolgen als eine Zeile zu behandeln, und behandelt die Newline-Zeichen als Inline-Zeichen, sodass sie mit ihnen übereinstimmen können. Um es anschaulicher auszudrücken: Die folgenden drei Textzeilen

1
2
3

werden als „1n2n3n“ betrachtet, eine Textzeile Modus bedeutet.

Aber das Schlimmste ist, dass Perl aus dem gleichen Grund (String-Variablen können mehrere Textzeilen enthalten) auch den /m-Modifikator erfunden hat, der den Mehrzeilenmodus darstellt. Die offizielle Beschreibung lautet „Behandeln Sie die Zeichenfolge.“ Als „Mehrzeilen“ ist dieses Muster seit der Antike im regulären JavaScript-Code enthalten. „Mehrzeilig“ bedeutet hier: Die Metazeichen ^ und $ stimmen nicht mit den Positionen vor und nach den Zeilenumbruchzeichen in der Mitte einer Zeichenfolge überein Standardmäßig bedeutet dies, dass die Zeichenfolge immer nur eine Zeile enthält. Sie können sie nach dem Aktivieren des Mehrzeilenmodus abgleichen.

Mit anderen Worten, der einzeilige Modus und der mehrzeilige Modus gelten für unterschiedliche Metazeichen. Personen, die mit regulären Ausdrücken noch nicht vertraut sind, werden durch die beiden scheinbar entsprechenden Begriffe „einzeiliger Modus“ und „mehrzeiliger Modus“ verwirrt sein "Modus"-Konzept, aber tatsächlich ist es mit nicht verwandten Begriffen verwirrend.

Später hatte der Autor von Ruby möglicherweise das Gefühl, dass der reguläre Begriff „Einzelzeilenmodus“ nicht gut verwendet wurde, und nannte den Modus „Mehrzeilenmodus“. ist, let . * und andere reguläre Ausdrücke können mit mehreren Zeilen übereinstimmen, sodass der Modifikator auch /m verwendet (Ruby aktiviert standardmäßig den „Mehrzeilenmodus“, sodass /m nicht belegt ist). Um das Ganze noch schlimmer zu machen, ist es sogar noch chaotischer.

Später war der Python-Autor möglicherweise auch der Meinung, dass der Begriff „Einzelzeilenmodus“ vermieden werden sollte, und gab ihm daher den neuen Namen „dotall“, was bedeutet, dass der Punkt mit allen Zeichen übereinstimmen kann sehr guter Name, und später verwendete auch Java diesen Namen.

Das Obige hat den Verlauf überprüft, den Ursprung des Single-Line-Modus erklärt und erklärt, dass der Name des Single-Line-Modus nicht gut gewählt wurde. V8 hat kürzlich einen ES-Vorschlag der Stufe 3 implementiert: https://github.com/mathiasbynens/es-regexp-dotall-flag. Dieser Vorschlag führt den /s-Modifikator und das dotAll-Attribut in die JavaScript-Regelmäßigkeit ein. Das dotAll-Attribut wird in Python und Java gelernt , der /s-Modifikator ist von Perl geerbt. Es besteht keine Notwendigkeit, hier einen neuen Modifikator wie /d zu erfinden, was die Sache nur komplizierter macht. Der spezifische Effekt von /s in JavaScript besteht darin, dass „.“ mit vier Zeilenabschlüssen übereinstimmt, die vorher nicht übereinstimmen konnten: n (Zeilenvorschub), r (Wagenrücklauf), u2028 (Zeilentrenner), u2029 (Absatztrenner):

/foo/s.dotAll // true
/^.{4}$/s.test("\n\r\u2028\u2029") // true

Tatsächlich ist es eine sehr einfache Sache, aber einige Schüler, die nicht mit anderen regulären Ausdrücken als JavaScript vertraut waren, lernen möglicherweise diesen neuen Modus Wenn es Verwirrung gibt, möchte ich es noch einmal klarstellen: Der Mehrzeilenmodus steuert die Leistung von ^ und $, und der Einzeilermodus steuert die Leistung von „.“ Es besteht keine direkte Beziehung zwischen den beiden.

Die Perl-Sprache, die ursprünglich die verwirrenden Konzepte des Einzelzeilenmodus und des Mehrzeilenmodus einführte, hat diese beiden Modi in Perl 6 jedoch vollständig gelöscht: „.“ stimmt standardmäßig mit Newline-Zeichen überein, und N kann mit Newline-Zeichen übereinstimmen Alle Zeichen außer ^ und $ stimmen immer mit dem Anfang und dem Ende der Zeichenfolge überein, während die beiden neu eingeführten Metazeichen ^^ und $$ mit dem Anfang und dem Ende der Zeile übereinstimmen.

Die Single-Line-Modus-Alternativen [^] oder [sS], die wir in der Vergangenheit häufig verwendet haben, sind nicht völlig nutzlos. In einigen Editoren, die JavaScript-Regelmäßigkeit verwenden (VS Code, Atom), ist dies beispielsweise der Fall Es ist unwahrscheinlich, dass Sie eine Schnittstelle zur Aktivierung des Single-Line-Modus bereitstellen. Wenn wir jedoch über die reguläre Funktion im Editor sprechen, ist die reguläre Funktion des in JavaScript implementierten Editors immer noch zu schwach. Beispielsweise können bestimmte Modi nicht im regulären Code selbst aktiviert werden, z. B. in Sublime Python-regulärer Code), innerhalb des regulären Codes. Verwenden Sie (?s), um den Dotall-Modus zu aktivieren. Sie können beispielsweise (?s)/*.+?*/ verwenden, um alle mehrzeiligen Kommentare abzugleichen. ,

Verwandte Empfehlungen:

Ersetzen der regulären JavaScript-Methode zur Implementierung des Suchschlüsselworts highlightsing_regular expression

Regulärer Ausdruck in JavaScript Das Konzept und die Anwendung von reguläre Ausdrücke_Reguläre Ausdrücke

Anwendung von regulären JavaScript-Ausdrücken

Das obige ist der detaillierte Inhalt vonJavaScript-Regex verfügt auch über einen einzeiligen Modus. 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