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)456
dopasowania456
( pozytywny wygląd ) -
123(?!456)
zawodzi ( negatywne spojrzenie w przyszłość ) -
(?<!123)456
nie działa ( negatywny wygląd )
Wejście : 456
-
123(?=456)
kończy się niepowodzeniem -
(?<=123)456
kończy się niepowodzeniem -
123(?!456)
kończy się niepowodzeniem -
(?<!123)456
dopasowania456
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.