Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. JavaScript

JavaScript-Reguläre Ausdrücke: Über die Grundlagen hinaus

Read Time: 10 mins

German (Deutsch) translation by Ines Willenbrock (you can also view the original English article)

In unserem vorherigen Tutorial über reguläre Ausdrücke in JavaScript haben Sie die Nützlichkeit regulärer Ausdrücke kennen gelernt und erfahren, wie Sie eigene schreiben können, um einfache Muster zu finden.

Nachdem Sie das vorherige Tutorial gelesen haben, sollten Sie nun ein gutes Verständnis von Sonderzeichen wie einem umgekehrten Schrägstrich und Zeichensequenzen wie z. B. \w oder \W. Hier ist eine kurze Zusammenfassung dieser Zeichensequenzen:

  1. Sie können \d oder \D verwenden, um eine Ziffer oder ein nicht-zifferiges Zeichen in einer beliebigen Zeichenfolge zu finden. Zu den Ziffernzeichen gehören 0, 1, 2, 3, 4, 5, 6, 7, 8 und 9. Alle anderen Zeichen außer diesen neun werden mit \D abgeglichen.
  2. Sie können \w oder \W verwenden, um ein Wort- oder Nicht-Wort-Zeichen in einer gegebenen Zeichenfolge zu finden. Zu den Wortzeichen gehören Alphabete, Ziffern und Unterstriche. Alles andere, wie ₹, % usw., wird als Nicht-Wort-Zeichen betrachtet.
  3. Sie können \s oder \S verwenden, um Leerzeichen oder Nicht-Leerzeichen in einer Zeichenfolge zu finden. Zu den Leerzeichen gehören Leerzeichen, Tabulator, Seitenvorschub und Zeilenvorschub.

Anstatt jeweils ein Zeichen abzugleichen, können Sie das Symbol * verwenden, um den vorhergehenden Ausdruck null oder mehr Mal abzugleichen. Das Zeichen + passt ebenfalls 1 oder mehrere Male auf den vorangehenden Ausdruck.

Sie können ein Muster beliebig oft abgleichen, indem Sie {n, m} an das Muster anhängen. Dabei ist n die Mindestanzahl der Übereinstimmungen und m die Höchstgrenze. Wenn Sie keinen Wert für m angeben, wird der vorhergehende Ausdruck so oft wie möglich abgeglichen.

Sie sollten mein vorheriges Tutorial lesen, wenn etwas, das wir gerade abgedeckt haben nicht klar ist. Ich habe dort alles ausführlicher erklärt.

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

Nicht-gierige Treffer mit dem ? Charakter

Das Zeichen ? hat eine unterschiedliche Bedeutung in verschiedenen Situationen.

Wenn dieses Zeichen allein verwendet wird, entspricht es dem Ausdruck, der vor ihm 0 oder 1 Mal stammt. In diesem Sinne ist es das gleiche wie bei {0,1}.

Sie können auch verwenden ? unmittelbar nach anderen Quantifizierern wie *, + und {}, um der minimale möglichen Anzahl von Zeichen zu entsprechen. Mit anderen Worten, es wird diese gierigen Quantifizierer in Nicht-Gierige verwandeln. Dies kann ein wenig schwer zu verstehen sein, ohne sich Live-Beispiele anzusehen, also sehen wir uns zuerst ein Beispiel an.

Betrachten Sie den folgenden Satz:

I have been assigned 17321HDGE as user id while my friend was assigned FHES193EK1.

Sehen wir uns nun alle Übereinstimmungen an, die von verschiedenen Quantifizierern und ihrem nicht gierigen Gegenstück zurückgegeben worden wären.

Wenn wir im Beispiel den Ausdruck /\d+/g verwenden, entspricht er einem oder mehreren aufeinander folgenden Ziffernzeichen. Aufgrund des globalen Flags wird es drei Treffer geben: 17321, 193 und 1.

Beachten Sie, dass 193 und 1 als unterschiedliche Übereinstimmungen betrachtet werden, da sie durch EK getrennt sind.

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

Wenn Sie nun nach \d+ ein ? Zeichen hinzufügen, erhalten Sie neun verschiedene Übereinstimmungen. Im Grunde genommen macht /\d+?/ jedes Ziffernzeichen zu einer separaten Übereinstimmung. Warum ist das so?

Das liegt daran, dass \d+ per Definition mit einer oder mehreren Ziffern übereinstimmen soll. Da das Zeichen ? mit der kleinstmöglichen Anzahl von Zeichen übereinstimmen soll, stimmt es immer nur mit einer einzigen Ziffer überein.

Der nicht-gierige ? Quantifizierer, gibt diesmal 9 kleinere einstellige Übereinstimmungen zurück. Der Kürze halber habe ich die Zeile auskommentiert, die die Treffer auf der Konsole protokolliert.

Nehmen wir ein anderes Beispiel: Der reguläre Ausdruck /\w+/ passt immer auf Wortzeichen, solange sie nicht durch ein Nicht-Wortzeichen wie ein Leerzeichen unterbrochen werden. In unserem Fall wird er ganze durch Leerzeichen getrennte Wörter wie assigned und 17321HDGE auf einmal abgleichen.

Wenn wir unseren ursprünglichen regulären Ausdruck durch /\w+/ ersetzen, erhalten wir 14 verschiedene Übereinstimmungen, im Grunde ist jedes Wort eine eigene Übereinstimmung. Sie können die Ausgabe selbst sehen, indem Sie die Zeile auskommentieren.

Wenn Sie nun den Ausdruck in /\w+?/ ändern, wird jedes Wortzeichen als separate Übereinstimmung zurückgegeben und Sie erhalten 68 Übereinstimmungen.

Schauen wir uns ein letztes Beispiel an, bevor wir weitermachen. Der reguläre Ausdruck /\w{4,}/ gibt alle Wörter in unserem Satz zurück, die vier Zeichen oder länger sind. Es passt also unter anderem auf have, been, assigned und 17321HDGE. Wenn Sie es nun in /\w{4,}?/ umwandeln, werden mehrere Treffer von Wörtern mit mehr als vier Zeichen gefunden. In unserem Beispiel wären die zurückgegebenen Übereinstimmungen have, been, assi, gned, 1732 und 1HGD. Das Zeichen E am Ende von 17321HDGE ist nicht Teil einer Übereinstimmung, da es nicht in der Gruppe von vier aufeinanderfolgenden Wortzeichen sein konnte.

Verwenden von Klammern mit dem ? Zeichen

In meinem vorherigen Regex-Tutorial habe ich kurz behandelt, wie Klammern verwendet werden können, um sich einen Teil einer Übereinstimmung zu merken. Bei Verwendung mit einem ? können sie auch anderen Zwecken dienen.

Manchmal möchten Sie, dass eine Gruppe von Zeichen als Einheit übereinstimmt. Sie können z. B. ein- oder zweimal nach den Vorkommen von na suchen, die im folgenden Text übereinstimmen.

na naa nnaa nana naana

Zur Klarstellung Sie suchen den fettformatierten Text als Übereinstimmungen: na naa nnaa (nana) naana. Der Teil in der Klammer soll als Einheit abgeglichen werden, so dass es nur als eine Übereinstimmung zählt.

Fast jeder, der gerade mit Regex anfängt, wird den Ausdruck /na{1,2}/ mit der Absicht verwenden, das erwartete Ergebnis zu erhalten. In ihren Köpfen soll der {1,2}-Teil mit einem oder zwei Vorkommen von n und a zusammen übereinstimmen. Tatsächlich passt er aber auf ein einzelnes Vorkommen von n gefolgt von 1 oder 2 Vorkommen des Zeichens a.

Ich habe die von /na{1,2}/ zurückgegebenen Übereinstimmungen zur Verdeutlichung fett dargestellt: na naa nnaa (na)(na) (naa)(na). Die Teile in den Klammern sind separate Übereinstimmungen. Wie Sie sehen können, erhalten wir nicht das gewünschte Ergebnis, da {1,2} nicht na als eine Einheit betrachtet wird, die gefunden werden muss.

Die Lösung hier ist, Klammern zu verwenden, um JavaScript zu sagen, dass na als Einheit übereinstimmen soll. Allerdings haben wir im vorherigen Tutorial gesehen, dass JavaScript sich die Übereinstimmung aufgrund der Klammern merken wird.

Wenn Sie nicht wollen, dass JavaScript sich die Übereinstimmung merkt, müssen Sie ?: vor der Gruppe von Zeichen hinzufügen, die Sie abgleichen wollen. In unserem Fall würde der endgültige Ausdruck zu /(?:na){1,2}/ werden. Die Gruppe na wird nun als eine Einheit gefunden und nicht mehr gespeichert. Ich habe die letzten Übereinstimmungen, die mit diesem Ausdruck zurückgegeben werden, fett hervorgehoben: na naa nnaa (nana) naana.

Im folgenden Beispiel werden alle Übereinstimmungen in der Konsole protokolliert. Da es insgesamt 6 Übereinstimmungen gibt, beträgt die Gesamtzahl der Übereinstimmungen 6.

Lookahead und Negated Lookahead

Es gibt viele Situationen, in denen wir versuchen, einen bestimmten Satz von Zeichen zu entsprechen, aber nur, wenn sie von einem anderen Satz von Zeichen gefolgt sind oder nicht. Sie könnten z. B. nach dem Wort apples in einem Text suchen, aber nur solche Übereinstimmungen wollen, auf die das Wort are folgt. Betrachten Sie den folgenden Satz.

apples are yummy. We ate apples all day. Everyone who ate apples liked them.

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

Eine Möglichkeit, dies zu erreichen, ist die Verwendung des folgenden regulären Ausdrucks a(?=b). Das Wort, auf das wir passen wollen, ist a und das Wort, das nach a kommen soll, ist b. In unserem Fall würde der Ausdruck zu /apples(?=\sare)/ werden. Denken Sie daran, dass das Wort are nicht in dieser Übereinstimmung enthalten ist.

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

Eine sehr ähnliche Situation würde entstehen, wenn Sie entscheiden würden, dass apples nur dann übereinstimmen, wenn sie nicht von einer bestimmten Gruppe von Zeichen gefolgt werden. In solchen Fällen müssen Sie ?= durch ?! in Ihrem regulären Ausdruck ersetzen. Wenn wir nach allen Vorkommen von apples suchen, die nicht von are gefolgt werden, verwenden wir /apples(?!\sare)/ als regulären Ausdruck. Für unseren Testsatz gibt es zwei erfolgreiche Übereinstimmungen.

Und noch etwas: Sie müssen nicht zwei separate reguläre Ausdrücke verwenden, um alle Übereinstimmungen zu finden, die von einem der beiden angegebenen Wörter gefolgt werden. Sie müssen nur den Pipe-Operator zwischen diesen Wörtern einfügen und schon sind Sie fertig. Wenn Sie zum Beispiel nach allen Vorkommen von apple suchen, auf die are oder were folgt, sollten Sie /apples(?!\sare|\swere)/ als regulären Ausdruck verwenden.

Letzte Gedanken

In diesem Lernprogramm haben wir gelernt, wie wir komplizierte reguläre Ausdrücke schreiben können, um die gesuchten Muster zu finden. Wir können das Sonderzeichen ? verwenden, um die minimal erforderliche Anzahl des vorangehenden Zeichens als Übereinstimmung zu erhalten. In ähnlicher Weise können wir das ? innerhalb von Klammern verwenden, um sicherzustellen, dass die Gruppe, auf die wir abgestimmt haben, nicht gespeichert wird. Schließlich haben wir gelernt, dass die Zeichensequenzen ?= und ?! in einem regulären Ausdruck uns die Möglichkeit geben, einen bestimmten Satz von Zeichen nur dann als Übereinstimmung zurückzugeben, wenn sie von einem anderen gegebenen Satz von Zeichen gefolgt werden oder nicht.

Wenn Sie Fragen im Zusammenhang mit diesem Tutorial haben, fühlen Sie sich frei, es mich wissen zu lassen, und ich werde mein Bestes tun, um sie zu erklären.

Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.