Regex lookahead, lookbehind i grupy atomowe
Znalazłem te rzeczy w moim ciele regex, ale nie mam pojęcia, do czego mogę ich użyć. Czy ktoś ma przykłady, żebym mógł spróbować zrozumieć, jak one działają?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
3 answers
Przykłady
Podany ciąg foobarbarfoo
:
bar(?=bar) finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar finds the 2nd bar ("bar" which does not have "foo" before it)
Można je również łączyć:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
Definicje
Spójrz w przyszłość pozytywnie (?=)
Znajdź wyrażenie A gdzie wyrażenie B następuje:
A(?=B)
Look ahead negative (?!)
Znajdź wyrażenie A gdzie wyrażenie B nie następuje:
A(?!B)
Look behind positive (?<=)
Znajdź wyrażenie A gdzie wyrażenie B poprzedza:
(?<=B)A
Look behind negative (?<!)
Znajdź wyrażenie A, gdzie wyrażenie B nie poprzedza:
(?<!B)A
Grupy atomowe (?>)
Grupa atomowa to grupa bez przechwytywania, która wychodzi z grupy i odrzuca wszystkie alternatywy po pierwszym dopasowaniu wzorca wewnątrz grupy, więc śledzenie wstecz jest wyłączone.
Grupa niematomiczna pozwoli na backtracking, nadal znajdzie pierwszy mecz, a jeśli dopasowanie nie powiedzie się, cofnie się i znajdzie następny mecz, dopóki dopasowanie dla całego wyrażenia jest Znalezione lub wszystkie możliwości są wyczerpane.
-
Grupa niematomowa w wyrażeniu
(foo|foot)s
zastosowanym dofoots
będzie:-
W 2007 roku, w 2008 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku, w 2009 roku]}
- dopasuj swoją drugą alternatywę
foot
, następnie sukces jakos
natychmiast następuje wfoots
i zatrzymaj się.
- dopasuj swoją drugą alternatywę
Grupa atomowa w wyrażenie
(?>foo|foot)s
zastosowane dofoots
dopasuje swoją pierwszą alternatywęfoo
, a następnie zakończy się, gdy funkcja backtracking jest wyłączona.
Niektóre zasoby
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 15:50:25
Lookarounds to twierdzenia o zerowej szerokości. Sprawdzają regex (w prawo lub w lewo od bieżącej pozycji-na podstawie przodu lub z tyłu), udaje się lub nie udaje, gdy dopasowanie jest znalezione (na podstawie, czy jest dodatnie lub ujemne) i odrzuca dopasowaną część. Nie zużywają żadnego znaku - dopasowanie regex za nimi (jeśli występuje), rozpocznie się w tej samej pozycji kursora.
Czytaj regular-expression.info Po Więcej Szczegółów.
- pozytywny wygląd:
Składnia:
(?=REGEX_1)REGEX_2
Dopasuj tylko wtedy, gdy pasuje REGEX_1; po dopasowaniu REGEX_1 dopasowanie jest odrzucane i wyszukiwanie REGEX_2 rozpoczyna się w tej samej pozycji.
Przykład:
(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
REGEX_1 jest [a-z0-9]{4}$
, który pasuje do czterech znaków alfanumerycznych, po których następuje koniec linii.
REGEX_2 to [a-z]{1,2}[0-9]{2,3}
, który pasuje do jednej lub dwóch liter, po których następują dwie lub trzy cyfry.
REGEX_1 upewnia się, że długość ciągu jest rzeczywiście 4, ale nie pochłania żadnych znaków, więc wyszukiwanie REGEX_2 rozpoczyna się w tym samym miejscu. Teraz REGEX_2 upewnia się, że łańcuch odpowiada innym regułom. Bez spojrzenia w przyszłość pasowałoby do strun o długości trzech lub pięciu.
- Negative lookahead
Składnia:
(?!REGEX_1)REGEX_2
Dopasuj tylko wtedy, gdy REGEX_1 nie pasuje; po sprawdzeniu REGEX_1 wyszukiwanie REGEX_2 rozpoczyna się w tej samej pozycji.
Przykład:
(?!.*\bFWORD\b)\w{10,30}$
Część look-ahead sprawdza FWORD
w łańcuchu i nie powiedzie się, jeśli znajduje. Jeśli nie znajdzie FWORD
, look-ahead powiedzie się, a następująca część sprawdza, czy Długość łańcucha wynosi od 10 do 30 i że zawiera tylko znaki wyrazowe a-zA-Z0-9_
Look-behind jest podobny do look-ahead: po prostu patrzy za bieżącą pozycję kursora. Niektóre wyrażenia regularne, takie jak javascript, nie obsługują twierdzeń typu look-behind. I większość smaków, które go obsługują (PHP, Python itp.) wymaga, aby część look-behind miała stałą długość.
- Atomic grupy zasadniczo odrzuca / zapomina kolejnych tokenów w grupie, gdy Token pasuje. Na tej stronie znajdziesz przykłady grup atomowych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-24 13:04:31
/ Align = "left" /
Jak odróżnić lookahead i lookbehind?
Take 2 minutes tour with me:
(?=) - positive lookahead
(?<=) - positive lookbehind
Przypuśćmy
A B C #in a line
Zapytamy B, gdzie jesteś?B ma dwa rozwiązania do deklarowania jej lokalizacji:
One, B has a ahead and has C bebind
Po drugie, B jest przed (lookahead) C i za (lookhehind) A.
Jak widzimy, tył i przód są przeciwne w tych dwóch rozwiązaniach.
Regex jest rozwiązaniem drugim.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-15 06:30:55