Regular Expressions
Lookahead und Lookbehind
Suche…
Syntax
- Positiver Lookahead:
(?=pattern)
- Negativer Lookahead:
(?!pattern)
- Positives Aussehen :
(?<=pattern)
- Negatives Aussehen :
(?<!pattern)
Bemerkungen
Wird nicht von allen Regex-Engines unterstützt.
Darüber hinaus beschränken viele Regex-Engines die Muster in Lookhinds auf Saiten mit fester Länge. Zum Beispiel sollte das Muster (?<=a+)b
mit dem b
in aaab
, wirft jedoch einen Fehler in Python.
Erfassungsgruppen sind erlaubt und funktionieren wie erwartet, einschließlich Rückreferenzen. Das Lookahead / Lookbehind selbst ist jedoch keine Fanggruppe.
Grundlagen
Ein positiver Lookahead (?=123)
, dass dem Text das angegebene Muster folgt, ohne dass das Muster in die Übereinstimmung einbezogen wird. In ähnlicher Weise behauptet ein positiver Look hinter (?<=123)
, dass dem Text das angegebene Muster vorangeht. Ersetzen des =
durch !
negiert die Behauptung.
Eingabe : 123456
-
123(?=456)
entspricht123
( positiver Lookahead ) -
(?<=123)456
Treffer456
( positiver Blick hinter ) -
123(?!456)
schlägt fehl ( negativer Lookahead ) -
(?<!123)456
schlägt fehl ( negativer Lookbehind )
Eingabe : 456
-
123(?=456)
schlägt fehl -
(?<=123)456
schlägt fehl -
123(?!456)
schlägt fehl -
(?<!123)456
entspricht456
Verwenden von lookbehind zum Testen von Endungen
Ein Lookbehind kann am Ende eines Musters verwendet werden, um sicherzustellen, dass es endet oder nicht in einer bestimmten Weise.
([az ]+|[AZ ]+)(?<! )
entspricht Sequenzen von nur Kleinbuchstaben oder nur Großbuchstaben, wobei nachfolgende Leerzeichen ausgeschlossen werden.
Simulieren von LookLang mit variabler Länge mit \ K
Einige reguläre Ausdrücke (Perl, PCRE, Oniguruma, Boost) unterstützen nur Lookbehinds mit fester Länge, bieten jedoch die Funktion \K
, mit der der Lookbehind mit variabler Länge zu Beginn eines Musters simuliert werden kann. Nach einer Begegnung mit \K
, der angepasste Text bis zu diesem Punkt wird verworfen, und nur der Text den Teil des Musters folgenden passenden \K
wird im Endergebnis gehalten.
ab+\Kc
Ist äquivalent zu:
(?<=ab+)c
Im Allgemeinen ein Muster der Form:
(subpattern A)\K(subpattern B)
Am Ende ähnlich sein:
(?<=subpattern A)(subpattern B)
Außer, wenn das B-Untermuster mit demselben Text wie das A-Untermuster übereinstimmen kann, kann dies zu geringfügig unterschiedlichen Ergebnissen führen, da das A-Untermuster den Text im Gegensatz zu einem echten Lookbehind immer noch verbraucht.