Reguläre Ausdrücke für JavaScript Jenseits der Grundlagen

In unserem vorherigen Tutorial über reguläre Ausdrücke in JavaScript haben Sie die Nützlichkeit von regulären Ausdrücken kennen gelernt und wie Sie einige Ihrer eigenen schreiben, um einfachen Mustern zu entsprechen.

Nachdem Sie das vorherige Tutorial gelesen haben, sollten Sie nun ein gutes Verständnis für Sonderzeichen wie einen umgekehrten Schrägstrich und ähnliche Zeichenfolgen haben \ w oder \ W. Hier ist eine wirklich schnelle Zusammenfassung dieser Zeichenfolgen:

  1. Sie können verwenden \ d oder \ D um eine Ziffer oder ein anderes Zeichen in einer beliebigen Zeichenfolge zu finden. Zu den Zeichen gehören 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9. Alle anderen Zeichen werden mit übereinstimmen \ D.
  2. Sie können verwenden \ w oder \ W um ein Wort oder ein Nicht-Wort-Zeichen in einer bestimmten Zeichenfolge zu finden. Word-Zeichen umfassen Alphabete, Ziffern und Unterstrich. Alles andere wie £,% usw. wird als Nicht-Wort-Zeichen betrachtet.
  3. Sie können verwenden \ s oder \ S Leerzeichen oder Nicht-Leerzeichen in einer Zeichenfolge. Leerzeichen umfassen Leerzeichen, Tabulatoren, Formular- und Zeilenvorschub.

Anstatt nur ein Zeichen auf einmal abzugleichen, können Sie die verwenden * Symbol, das dem vorhergehenden Ausdruck null oder mehrmals entspricht. Das + Das Zeichen entspricht in ähnlicher Weise mindestens 1 Mal dem vorhergehenden Ausdruck.

Sie können ein Muster beliebig oft abgleichen, indem Sie es anhängen n, m dazu Hier, n ist die minimale Anzahl von Malen, die Sie dem entsprechen sollen, und m ist die maximale Grenze. Wenn Sie keinen Wert für angeben m, Der vorhergehende Ausdruck wird so oft wie möglich abgeglichen.

Sie sollten mein vorheriges Tutorial überprüfen, wenn etwas, das wir gerade behandelt haben, nicht klar ist. Ich habe dort alles näher erklärt.

Kommen wir nun zu den komplexeren Zeichenfolgen in regulären Ausdrücken, damit Sie das Beste aus ihnen herausholen und herausfinden können, wie Sie Ausdrücke schreiben können, die mit komplizierten Mustern übereinstimmen.

Nicht-gierige Übereinstimmungen mit der ? Charakter

Das ? Charakter bedeutet verschiedene Dinge in verschiedenen Situationen.

Wenn dieses Zeichen alleine verwendet wird, stimmt es mit dem Ausdruck überein, der 0 oder 1 Mal davor kam. In diesem Sinne ist es das Gleiche wie 0,1.

Sie können auch verwenden ? gleich nach anderen quantifizierern wie *, + und um die minimal mögliche Anzahl von Zeichen zu finden. Mit anderen Worten, es werden diese gierigen Quantifizierer nicht gierig. Dies kann etwas schwer zu verstehen sein, ohne Live-Beispiele zu betrachten. Sehen wir uns also zuerst ein Beispiel an.

Betrachten Sie den folgenden Satz:

Mir wurde 17321HDGE als Benutzer-ID zugewiesen, während meinem Freund FHES193EK1 zugewiesen wurde.

Nun sehen wir uns alle Übereinstimmungen an, die von verschiedenen Quantifizierern und ihrem nicht gierigen Gegenstück zurückgegeben würden.

Wenn wir den Ausdruck verwenden / \ d + / g In diesem Beispiel stimmt es mit einem oder mehreren aufeinanderfolgenden Ziffern überein. Aufgrund der globalen Flagge gibt es drei Spiele: 17321, 193, und 1.

Das solltest du beachten 193 und 1 werden als unterschiedliche Übereinstimmungen betrachtet, da sie durch getrennt werden EK.

Das folgende Beispiel zeigt die Übereinstimmungen ohne die Verwendung von Quantifizierern.

var re = / \ d + / g; var count = 0; var textString = "Mir wurde 17321HDGE als Benutzer-ID zugewiesen, während meinem Freund FHES193EK1 zugewiesen wurde."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ausgabe 17321 193 1 Insgesamt Treffer: 3 * /

Nun fügen Sie ein ? Zeichen nach \ d+ wird neun verschiedene Spiele zurückgeben. Grundsätzlich gilt, / \ d +? / verwandelt jedes Zeichen in einen separaten Treffer. Warum das?

Es ist weil \ d+ soll per Definition mit einer oder mehreren Ziffern übereinstimmen. Seit der ? Zeichen soll der kleinstmöglichen Anzahl von Zeichen entsprechen, es entspricht nur einer einzelnen Ziffer.

Das nicht gierig ? Der Quantifizierer gibt dieses Mal 9 kleinere einstellige Übereinstimmungen zurück. Der Kürze halber habe ich die Zeile, in der die Übereinstimmungen auf der Konsole protokolliert werden, auskommentiert.

var re = / \ d + g / g; var count = 0; var textString = "Mir wurde 17321HDGE als Benutzer-ID zugewiesen, während meinem Freund FHES193EK1 zugewiesen wurde."; var match = re.exec (textString); while (match! == null) // console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ergebnis insgesamt: 9 * /

Nehmen wir ein anderes Beispiel. Der reguläre Ausdruck / \ w + / hält übereinstimmende Wortzeichen, solange sie nicht durch ein Nicht-Wort-Zeichen wie Leerzeichen unterbrochen werden. In unserem Fall stimmen die Wörter mit ganzen durch Leerzeichen getrennten Wörtern überein zugewiesen und 17321HDGE einmal.

Wenn wir unseren ursprünglichen regulären Ausdruck durch ersetzen / \ w + /, Wir werden 14 verschiedene Spiele bekommen. Grundsätzlich ist jedes Wort eine eigene Übereinstimmung. Sie können die Ausgabe selbst sehen, indem Sie die Zeile auskommentieren.

var re = / \ w + / g; var count = 0; var textString = "Mir wurde 17321HDGE als Benutzer-ID zugewiesen, während meinem Freund FHES193EK1 zugewiesen wurde."; var match = re.exec (textString); while (match! == null) // console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ergebnis insgesamt: 14 * /

Ändern Sie jetzt den Ausdruck in / \ w +? / Jedes Wortzeichen wird als separate Übereinstimmung zurückgegeben, und Sie erhalten 68 Übereinstimmungen.

Werfen wir einen Blick auf ein letztes Beispiel, bevor wir fortfahren. Der reguläre Ausdruck / \ w 4, / gibt alle Wörter in unserem Satz zurück, die aus vier oder mehr Zeichen bestehen. So passt es zusammen haben, gewesen, zugewiesen, und 17321HDGE, unter anderen. Wende es jetzt an / \ w 4,? / würde mehrere Übereinstimmungen von Wörtern mit mehr als vier Zeichen zurückgeben. In unserem Beispiel wären die zurückgegebenen Matches haben, gewesen, assi, gned, 1732, und 1HGD. Der Charakter E am Ende von 17321HDGE ist nicht Teil eines Spielsweil es nicht in der Gruppe von vier aufeinanderfolgenden Wortzeichen sein konnte.

var re = / \ w 4 / g; var count = 0; var textString = "Mir wurde 17321HDGE als Benutzer-ID zugewiesen, während meinem Freund FHES193EK1 zugewiesen wurde."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ausgabe wurde 17321HDGE Benutzer zugewiesen, während Freund FHES193EK1 Treffer insgesamt zugewiesen wurde: 9 * /

Verwenden von Klammern mit dem? Charakter

In meinem vorherigen Regex-Tutorial habe ich kurz erläutert, wie Klammern verwendet werden können, um sich an einen Teil eines Matches zu erinnern. Bei Verwendung mit einem ? Charakter können sie auch anderen Zwecken dienen.

Manchmal möchten Sie, dass eine Gruppe von Zeichen als Einheit übereinstimmt. Zum Beispiel könnten Sie nach den Vorkommen von suchen n / a ein- oder zweimal als Übereinstimmung im folgenden Text.

na naa nnaa nana naana

Zur Verdeutlichung suchen Sie nach dem fetten Text als Übereinstimmungen: n / a n / aeinn / aein (nana) n / aeinn / a. Der Teil in den Klammern sollte als Einheit abgeglichen werden, er zählt also nur als eine Übereinstimmung.

Fast jeder, der gerade erst mit Regex beginnt, wird den Ausdruck verwenden / na 1,2 / mit der Absicht, das erwartete Ergebnis zu erzielen. In ihren Gedanken die 1,2 Teil soll ein oder zwei Vorkommen von entsprechen n und ein zusammen. Es entspricht jedoch tatsächlich einem einzigen Vorkommen von n gefolgt von 1 oder 2 Vorkommen des Zeichens ein.

Ich habe die Übereinstimmungen zurückgegeben von / na 1,2 / zur Verdeutlichung in Fettdruck: n / a naa nnaa (na) (na) (naa) (na). Die Teile in den Klammern sind separate Übereinstimmungen. Wie Sie sehen, bekommen wir nicht das gewünschte Ergebnis, weil 1,2 überlegt nicht n / a eine einzelne Einheit sein, die angepasst werden muss.

Die Lösung hier ist die Verwendung von Klammern, um JavaScript mitzuteilen n / a als eine Einheit. Wie wir jedoch bereits im vorherigen Tutorial gesehen haben, wird JavaScript aufgrund der Klammern anfangen, sich an die Übereinstimmung zu erinnern.

Wenn Sie nicht möchten, dass sich JavaScript an den Treffer erinnert, müssen Sie hinzufügen ?: vor der Gruppe von Zeichen, die Sie zuordnen möchten. In unserem Fall würde der endgültige Ausdruck werden / (?: na) 1,2 /. Die Gruppe n / a wird jetzt als Einheit abgeglichen, und es wird nicht erinnert. Ich habe die letzten Übereinstimmungen hervorgehoben, die mit diesem Ausdruck in Fettdruck zurückgegeben wurden: n / a n / aeinn / aein (Nana) n / aeinn / a.

Im folgenden Beispiel werden alle Übereinstimmungen in der Konsole protokolliert. Da insgesamt 6 Übereinstimmungen vorhanden sind, beträgt die Gesamtanzahl der Übereinstimmungen 6.

var re = / (?: na) 1,2 / g; var count = 0; var textString = "na naa nnaa nana naana"; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Leistung na na naana na na Treffer insgesamt: 6 * /

Lookahead und Negated Lookahead

Es gibt viele Situationen, in denen wir versuchen, eine bestimmte Gruppe von Zeichen zu finden, aber nur, wenn auf sie eine andere Gruppe von Zeichen folgt oder nicht. Sie könnten beispielsweise nach dem Wort suchen Äpfel in einem Text wollen aber nur die Übereinstimmungen, denen gefolgt wird sind. Betrachten Sie den folgenden Satz.

Äpfel sind lecker. Wir haben den ganzen Tag Äpfel gegessen. Jeder, der Äpfel aß, mochte sie.

Im obigen Beispiel möchten wir nur das erste Wort als Übereinstimmung. Jedes andere Vorkommen des Wortes sollte nicht in den Übereinstimmungen enthalten sein.

Eine Möglichkeit, dies zu erreichen, ist die Verwendung des folgenden regulären Ausdrucks a (? = b). Das Wort, das wir zusammenbringen wollen, ist ein, und das Wort, das danach kommen sollte ein ist b. In unserem Fall würde der Ausdruck werden / Äpfel (? = \ sare) /. Erinnere dich an das Wort sind ist in diesem Spiel nicht enthalten.

var re = / Äpfel (? = \ sare) / g; var count = 0; var textString = "Äpfel sind lecker. Wir haben den ganzen Tag Äpfel gegessen. Jeder, der Äpfel gegessen hat, mochte sie."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ausgabe Äpfel Gesamtübereinstimmung: 1 * /

Dieser reguläre Ausdruck, in dem wir uns anschauen, was als nächstes in der Zeichenfolge kommt, bevor wir entscheiden, ob das Wort eine Übereinstimmung ist, wird als Lookahead bezeichnet.

Eine sehr ähnliche Situation würde sich ergeben, wenn Sie sich dafür entscheiden würden Äpfel nur wenn es war nicht gefolgt von einer bestimmten Menge von Zeichen. In solchen Fällen müssen Sie ersetzen ?= mit ?! in deinem regulären Ausdruck. Wenn wir nach allen Vorkommen von gesucht hätten Äpfel welche sind nicht gefolgt von sind, wir werden verwenden / Äpfel (?! \ sare) / als unser regulärer Ausdruck. Es gibt zwei erfolgreiche Spiele für unseren Testsatz.

var re = / Äpfel (?! \ sare) / g; var count = 0; var textString = "Äpfel sind lecker. Wir haben den ganzen Tag Äpfel gegessen. Jeder, der Äpfel gegessen hat, mochte sie."; var match = re.exec (textString); while (match! == null) console.log (match [0]); match = re.exec (textString); count ++;  console.log ("Gesamtübereinstimmung:" + Anzahl); / * Ausgabe Äpfel Äpfel Gesamtübereinstimmung: 2 * /

Eine weitere Sache - Sie müssen nicht zwei separate reguläre Ausdrücke verwenden, um alle Übereinstimmungen zu finden, denen zwei der angegebenen Wörter folgen. Alles, was Sie tun müssen, ist, den Pipe-Operator zwischen diesen Wörtern hinzuzufügen, und Sie sind gut zu gehen. Wenn Sie beispielsweise nach allen Vorkommen von Apfel suchen, die von gefolgt werden sind oder wurden, du solltest benutzen / Äpfel (?! \ sare | \ swere) / als dein regulärer Ausdruck.

Abschließende Gedanken

In diesem Lernprogramm haben wir gelernt, wie Sie komplizierte reguläre Ausdrücke schreiben, um den Mustern zu entsprechen, nach denen wir suchen. Wir können das Besondere nutzen ? Zeichen, um die minimal erforderliche Anzahl des vorhergehenden Zeichens als Übereinstimmung zurückzugeben. Ebenso können wir das verwenden ? in Klammern, um sicherzustellen, dass die Gruppe, zu der wir passen, nicht gespeichert wird. 

Schließlich haben wir gelernt, dass die ?= und ?! Zeichenfolgen in einem regulären Ausdruck geben uns die Möglichkeit, eine bestimmte Menge von Zeichen nur dann als Übereinstimmung zurückzugeben, wenn ihnen eine andere gegebene Menge von Zeichen folgt oder nicht.

Wenn Sie Fragen zu diesem Tutorial haben, lassen Sie es mich wissen und ich werde mein Bestes geben, um sie zu erklären.