Regular Expressions
Lookahead i Lookbehind
Szukaj…
Składnia
- Pozytywne spojrzenie w przód:
(?=pattern) - Negatywne spojrzenie w przód:
(?!pattern) - Pozytywny wygląd :
(?<=pattern) - Negatywny wygląd :
(?<!pattern)
Uwagi
Nie obsługiwane przez wszystkie silniki regex.
Ponadto wiele silników wyrażeń regularnych ogranicza wzorce wewnątrz ciągów znaków do ciągów o stałej długości. Na przykład wzorzec (?<=a+)b powinien pasować do b w aaab ale generuje błąd w Pythonie.
Przechwytywanie grup jest dozwolone i działa zgodnie z oczekiwaniami, w tym odwołań wstecznych. Jednak sam lookahead / lookbehind nie jest grupą przechwytującą.
Podstawy
Dodatni lookahead (?=123) zapewnia, że po tekście znajduje się podany wzorzec, bez uwzględnienia wzorca w dopasowaniu. Podobnie dodatni wygląd (?<=123) potwierdza, że tekst jest poprzedzony danym wzorcem. Zamiana = ! neguje to twierdzenie.
Dane wejściowe : 123456
-
123(?=456)dopasowania123( pozytywne spojrzenie w przyszłość ) -
(?<=123)456dopasowania456( pozytywny wygląd ) -
123(?!456)zawodzi ( negatywne spojrzenie w przyszłość ) -
(?<!123)456nie działa ( negatywny wygląd )
Wejście : 456
-
123(?=456)kończy się niepowodzeniem -
(?<=123)456kończy się niepowodzeniem -
123(?!456)kończy się niepowodzeniem -
(?<!123)456dopasowania456
Używanie lookbehind do testowania zakończeń
Na końcu wzoru można zastosować lookbehind, aby upewnić się, że kończy się on lub nie w określony sposób.
([az ]+|[AZ ]+)(?<! ) dopasowuje ciągi tylko małych lub wielkich liter, wykluczając końcowe białe znaki.
Symulowanie wyglądu zmiennej długości za pomocą \ K
Niektóre smaki wyrażeń regularnych (Perl, PCRE, Oniguruma, Boost) obsługują tylko lookhinds o stałej długości, ale oferują funkcję \K , której można użyć do symulacji looku o zmiennej długości na początku wzoru. Po napotkaniu \K dopasowany tekst do tego momentu jest odrzucany, a tylko tekst pasujący do części wzoru następującego po \K zostaje zachowany w wyniku końcowym.
ab+\Kc
Jest równa:
(?<=ab+)c
Ogólnie wzór formularza:
(subpattern A)\K(subpattern B)
W końcu jest podobny do:
(?<=subpattern A)(subpattern B)
Z wyjątkiem sytuacji, gdy wzór B może pasować do tego samego tekstu co wzór A - możesz uzyskać subtelnie różne wyniki, ponieważ wzór A nadal zużywa tekst, w przeciwieństwie do prawdziwego wyglądu.