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
Author: grenierm5, 2010-06-04

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 do foots 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]}
    1. dopasuj swoją drugą alternatywę foot, następnie sukces jako s natychmiast następuje w foots i zatrzymaj się.
  • Grupa atomowa w wyrażenie (?>foo|foot)s zastosowane do foots dopasuje swoją pierwszą alternatywę foo, a następnie zakończy się, gdy funkcja backtracking jest wyłączona.

Niektóre zasoby

 557
Author: skyfoot,
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
 194
Author: Amarghosh,
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.

 0
Author: JawSaw,
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