W3docs

Lookahead und Lookbehind

In diesem Kapitel untersuchen wir die Suche nach Übereinstimmungen in JavaScript. Lernen Sie, Lookahead und Lookbehind praktisch einzusetzen.

Das Verständnis der fortgeschrittenen Themen regulärer Ausdrücke in JavaScript ist für jeden Entwickler hilfreich, der seine Programmierkenntnisse erweitern möchte. Zu den leistungsstärksten Funktionen in diesem Bereich gehören Lookahead- und Lookbehind-Assertions. Diese Assertions ermöglichen es Entwicklern, Muster im Text zu suchen, ohne diese Muster in das Ergebnis einzubeziehen. Dieser Leitfaden bietet eine ausführliche Erkundung der Lookahead- und Lookbehind-Assertions in JavaScript, ergänzt durch zahlreiche praktische Beispiele.

Warnung

Reguläre Ausdrücke können tückisch sein, und Randfälle können auftreten. Das gilt besonders bei der Verwendung fortgeschrittener Konzepte wie Lookahead und Lookbehind. Verwenden Sie Online-Regex-Tester oder schreiben Sie Unit-Tests, um Ihre Ausdrücke gegen eine Vielzahl von Eingabeszenarien zu validieren und sicherzustellen, dass sie sich wie erwartet verhalten.

Einführung in Lookahead- und Lookbehind-Assertions

Lookahead- und Lookbehind-Assertions sind sogenannte Zero-Width-Assertions (Behauptungen ohne Breite). Das bedeutet, sie treffen auf eine Position innerhalb des Strings zu, nicht auf tatsächliche Zeichen. Sie erlauben es, zu prüfen, ob ein bestimmtes Muster an einer bestimmten Stelle im String vorhanden ist oder nicht. Hinweis: Moderne JavaScript-Engines (ES2018+) unterstützen Lookbehind-Assertions mit variabler Länge, obwohl einige ältere Umgebungen Muster mit fester Länge erfordern.

Es gibt vier Assertions, die durch die Kombination von Richtung (ahead/behind) und Polarität (positiv/negativ) gebildet werden:

AssertionSyntaxBedeutung
Positiver Lookahead(?=...)Das Muster muss auf diese Position folgen
Negativer Lookahead(?!...)Das Muster darf nicht auf diese Position folgen
Positiver Lookbehind(?<=...)Das Muster muss dieser Position vorangehen
Negativer Lookbehind(?<!...)Das Muster darf nicht dieser Position vorangehen

Warum "zero-width" wichtig ist

Da Assertions eine Position und keine Zeichen treffen, wird der geprüfte Text niemals in das Ergebnis aufgenommen, und die Leseposition der Regex-Engine rückt nicht darüber hinaus. Genau das macht sie nützlich: Man kann Kontext um eine Übereinstimmung fordern, ohne dass dieser Kontext Teil des Ergebnisses wird. Das folgende Codebeispiel zeigt den Unterschied zwischen einer echten Capturing-Gruppe und einem Lookahead — beide prüfen, ob pie auf apple folgt, aber nur die Gruppe verbraucht den Text:

javascript— editable

Wenn Sie mit der (...)-Gruppensyntax noch nicht vertraut sind, lesen Sie Capturing groups — die Lookaround-Syntax baut auf denselben Klammern auf, fügt aber direkt nach der öffnenden Klammer ?=, ?!, ?<= oder ?<! hinzu.

Positiver Lookahead

Eine positive Lookahead-Assertion prüft, ob ein bestimmtes Muster nach der aktuellen Position im String vorhanden ist. Sie wird durch (?=...) angegeben. Das folgende Beispiel verwendet einen positiven Lookahead, um das Wort "apple" zu finden, dem das Wort "pie" folgt:

Javascript regexp lookaround corresponds to characters

javascript— editable

Negativer Lookahead

Eine negative Lookahead-Assertion prüft, ob ein bestimmtes Muster nach der aktuellen Position nicht vorhanden ist. Sie wird durch (?!...) angegeben. Das folgende Beispiel verwendet einen negativen Lookahead, um das Wort "apple" zu finden, dem das Wort "pie" nicht folgt:

Javascript regexp the negative lookahead

javascript— editable

Positiver Lookbehind

Eine positive Lookbehind-Assertion prüft, ob ein bestimmtes Muster vor der aktuellen Position im String vorhanden ist. Sie wird durch (?<=...) angegeben. Das folgende Codebeispiel sucht nach dem Wort "pie", dem das Wort "apple" vorangeht:

Javascript regexp the positive lookbehind

javascript— editable

Negativer Lookbehind

Eine negative Lookbehind-Assertion prüft, ob ein bestimmtes Muster vor der aktuellen Position nicht vorhanden ist. Sie wird durch (?<!...) angegeben. Das folgende Beispiel sucht nach dem Wort "pie", dem das Wort "apple" nicht vorangeht:

Lookahead and Lookbehind

javascript— editable

Praktische Anwendungen von Lookahead und Lookbehind

Passwortstärke validieren

Die Sicherstellung starker Passwörter ist eine häufige Anforderung in Webanwendungen. Lookahead-Assertions lassen sich verwenden, um verschiedene Passwortbedingungen zu prüfen, ohne dabei Zeichen zu verbrauchen.


javascript— editable

Hier ist jedes (?=...) eine separate Anforderung, die vom Anfang des Strings geprüft wird. Da jeder Lookahead zero-width ist, durchsuchen alle vier denselben Text unabhängig voneinander, ohne sich gegenseitig zu beeinflussen. Das abschließende [A-Za-z\d@$!%*?&]{8,} ist das Element, das das Passwort tatsächlich verbraucht. Die Anker ^ und $ pinnen die Prüfung auf den gesamten String, und {8,} ist ein Quantifizierer, der mindestens acht Zeichen fordert.

Daten formatieren und parsen

Lookahead- und Lookbehind-Assertions können bei der Formatierung und beim Parsen komplexer Datenstrukturen helfen. Ein gutes Beispiel ist das Einfügen von Kommas in eine Zahlenfolge zur besseren Lesbarkeit:


javascript— editable

Dies funktioniert, indem jede leere Position (\B, eine Nicht-Wortgrenze) ersetzt wird, auf die eine Gruppe von drei Ziffern folgt, die bis zum Ende der Zahl wiederholt werden. Das abschließende (?!\d) stellt sicher, dass nur Positionen getroffen werden, an denen die verbleibenden Ziffern gleichmäßig in Dreiergruppen aufgeteilt werden können, sodass kein Komma ganz am Anfang gesetzt wird.

Den Betrag aus einem Preis extrahieren

Lookbehind ist ideal, um einen Wert zu extrahieren, der nach einem bekannten Marker steht, ohne den Marker selbst zu erfassen. Hier wird der numerische Betrag extrahiert, der auf ein $-Zeichen folgt:

javascript— editable

Der (?<=\$)-Lookbehind verlangt, dass direkt vor der Zahl ein $ steht, schließt dieses aber nicht in das Ergebnis ein. Jede Übereinstimmung enthält daher nur den Betrag. Vergleicht man dies mit einer Capturing-Gruppe — eine Gruppe würde erfordern, den Betrag aus match[1] auszulesen, während der Lookbehind den Wert direkt in die Übereinstimmung legt.

Nur handeln, wenn etwas nicht folgt

Negativer Lookahead ermöglicht es, an einer Position zu handeln, basierend darauf, was nicht als nächstes kommt. Dieses Beispiel ersetzt hello durch HI, nur wenn es nicht von world gefolgt wird:

javascript— editable

Verwandte Themen

Fazit

Die Beherrschung von Lookahead- und Lookbehind-Assertions in JavaScript kann Ihre Fähigkeit zur Manipulation und Analyse von Strings erheblich verbessern. Diese leistungsstarken Werkzeuge bieten die Flexibilität, Muster zu prüfen, ohne Zeichen zu verbrauchen, und sind damit unverzichtbar für komplexe Textverarbeitungsaufgaben. Durch den Einsatz dieser Assertions können Entwickler effizientere und wirkungsvollere reguläre Ausdrücke erstellen, was zu sauberem und besser wartbarem Code führt.

Übung

Übung
Welche der folgenden Aussagen über Lookahead- und Lookbehind-Assertions in JavaScript sind korrekt?
Welche der folgenden Aussagen über Lookahead- und Lookbehind-Assertions in JavaScript sind korrekt?
Was this page helpful?