Znalazłem te rzeczy w moim wyrażeniu regularnym, ale nie mam pojęcia, do czego mogę ich użyć. Czy ktoś ma przykłady, więc mogę spróbować zrozumieć, jak działają?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
regex
lookaround
Spidfire
źródło
źródło
Odpowiedzi:
Przykłady
Biorąc pod uwagę ciąg
foobarbarfoo
:Możesz je również łączyć:
Definicje
Patrz w przyszłość pozytywnie
(?=)
Znajdź wyrażenie A, po którym następuje wyrażenie B:
Patrz w przyszłość negatywnie
(?!)
Znajdź wyrażenie A, w którym nie występuje wyrażenie B:
Spójrz za siebie
(?<=)
Znajdź wyrażenie A, w którym wyrażenie B poprzedza:
Spójrz za negatywne
(?<!)
Znajdź wyrażenie A, w którym wyrażenie B nie poprzedza:
Grupy atomowe
(?>)
Grupa atomowa wychodzi z grupy i wyrzuca alternatywne wzorce po pierwszym dopasowanym wzorcu w grupie (cofanie jest wyłączone).
(?>foo|foot)s
zastosowane dofoots
dopasuje swoją pierwszą alternatywęfoo
, a następnie zakończy się niepowodzeniem, ponieważs
nie następuje natychmiast, i zatrzyma się, gdy cofanie będzie wyłączoneGrupa nieatomowa pozwoli na powrót; jeśli kolejne dopasowanie z wyprzedzeniem nie powiedzie się, nastąpi powrót i użycie alternatywnych wzorców do momentu znalezienia dopasowania dla całego wyrażenia lub wyczerpania wszystkich możliwości.
(foo|foot)s
stosowane dofoots
:foo
, a następnie zawiod, ponieważs
nie następuje natychmiastfoots
, i cofnij się do drugiej alternatywy;foot
, a następnie odnieś sukces, jak tylkos
nastąpifoots
, i zatrzymaj się.Niektóre zasoby
Testerzy online
źródło
Lookarounds to asercje o zerowej szerokości. Sprawdzają regex (w prawo lub w lewo od bieżącej pozycji - w oparciu o przód lub tył), udaje się lub nie, gdy zostanie znalezione dopasowanie (na podstawie, czy jest ono dodatnie lub ujemne) i odrzuca dopasowaną część. Nie zużywają żadnych znaków - dopasowanie wyrażenia regularnego po nim (jeśli istnieje) rozpocznie się od tej samej pozycji kursora.
Przeczytaj regular-expression.info, aby uzyskać więcej informacji.
Składnia:
Dopasuj tylko, jeśli REGEX_1 pasuje; po dopasowaniu REGEX_1 dopasowanie zostanie odrzucone, a wyszukiwanie REGEX_2 rozpocznie się od tej samej pozycji.
przykład:
REGEX_1
[a-z0-9]{4}$
pasuje do czterech znaków alfanumerycznych, po których następuje koniec linii.REGEX_2
[a-z]{1,2}[0-9]{2,3}
odpowiada jednej lub dwóm literom, po których następują dwie lub trzy cyfry.REGEX_1 upewnia się, że długość ciągu rzeczywiście wynosi 4, ale nie zużywa żadnych znaków, więc wyszukiwanie REGEX_2 rozpoczyna się w tym samym miejscu. Teraz REGEX_2 upewnia się, że łańcuch pasuje do innych reguł. Bez przewidywania pasowałby do ciągów długości trzech lub pięciu.
Składnia:
Dopasuj tylko, jeśli REGEX_1 nie pasuje; po sprawdzeniu REGEX_1 wyszukiwanie REGEX_2 rozpoczyna się w tej samej pozycji.
przykład:
Część wyprzedzająca sprawdza
FWORD
ciąg znaków i kończy się niepowodzeniem, jeśli go znajdzie. Jeśli nie zostanie znalezioneFWORD
, przeglądanie powiedzie się, a następna część sprawdza, czy długość łańcucha wynosi od 10 do 30 i czy zawiera tylko znaki słownea-zA-Z0-9_
Spojrzenie za siebie jest podobne do patrzenia w przyszłość: po prostu spogląda za bieżącą pozycję kursora. Niektóre smaki wyrażeń regularnych, takie jak javascript, nie obsługują asertywnych stwierdzeń. I większość smaków, które go obsługują (PHP, Python itp.) Wymagają, aby ta część z tyłu miała stałą długość.
źródło
(?=REGEX_1)REGEX_2
pasuje tylko, jeśliREGEX_2
przyjdzie późniejREGEX_1
?Gwałtownie się rozgląda.
Jak odróżnić lookahead i lookbehind? Wybierz się na 2-minutową wycieczkę ze mną:
Przypuszczać
Teraz pytamy B, gdzie jesteś?
B ma dwa rozwiązania, które deklarują lokalizację:
Jeden, B ma A do przodu i ma C do drugiego
Dwa, B jest do przodu (z wyprzedzeniem) C i z tyłu (do tyłu) A.
Jak widzimy, oba rozwiązania są z tyłu i z przodu.
Regex to rozwiązanie drugie.
źródło