Czasowniki, które działają po cofnięciu i porażce

[[13]] Ostatnio czytałam w PCRE - (Perl-compatible regular expressions) dokumentacji i natknął się na kilka ciekawych trików z wyrażeniami regularnymi. Gdy kontynuowałem czytanie i wyczerpywanie się, przestałem z powodu pewnego zamieszania w związku z używaniem kilku wzorów {[1] }.

Moje pytanie i zamieszanie dotyczy (*PRUNE) i (*FAIL)

Teraz dla odniesienia (*SKIP) działa jak (*PRUNE), z wyjątkiem tego, że jeśli wzór jest niezauważony, bumpalong advance nie do następnego znaku, ale do pozycji w temacie, w którym napotkano (*SKIP).

Dokumentacja stwierdza, że (*PRUNE) powoduje niepowodzenie dopasowania na bieżącej pozycji wyjściowej w temacie, jeśli reszta wzorca nie pasuje. I stwierdza (*FAIL) synonim (?!) twierdzenia negatywnego. Wymusza dopasowanie błędu w podanej pozycji we wzorze.

Więc zasadniczo (*FAIL) zachowuje się jak nieudane twierdzenie negatywne i jest synonimem (?!)

I (*PRUNE) powoduje niepowodzenie dopasowania na bieżącej pozycji wyjściowej w temacie, jeśli później wystąpi błąd dopasowania, który spowoduje, że backtracking do niego dotrze.

Czym się różnią, jeśli chodzi o porażkę?

Czy ktoś może podać przykłady, w jaki sposób są one prawidłowo wdrażane i wykorzystywane?

Author: hwnd, 2013-11-15

1 answers

Zanim przeczytasz tę odpowiedź, powinieneś zapoznać się z mechanizmem cofania, grupami atomowymi i kwantyfikatorami dzierżawnymi. Informacje na temat tych pojęć i funkcji można znaleźć w książce Friedla i pod poniższymi linkami: {37]} www.regular-expressions.info, www.rexegg.com

Wszystkie testy zostały wykonane za pomocą globalnego wyszukiwania (z funkcją preg_match_all()).

(*FAIL)

baabo caaco daado

caac(*FAIL)|aa.|caaco|co

[0] => aab
[1] => caaco
[2] => aad

(*FAIL) spowodować dokładnie to samo zachowanie niż "zły charakter" we wzorze. Jeśli zastąpisz go przez "R", uzyskasz dokładnie taki sam wynik: caacR|aa.|caaco|co. Aby być bardziej ogólnym, możesz rzeczywiście zastąpić (*FAIL) przez "zawsze zawodzącą podpunktę", jak: (?!), (?=a(?<!a)) ...

a (first from "baabo") : bez zaskoczenia pierwszy wynik znajduje druga alternatywa. (aab)

c (first) : Silnik regex napotka pierwsze" c " i spróbuje pierwszej alternatywy I find: caac, ale podpattern jest zmuszony zawieść. Następnie silnik regex (zawsze z pierwsza "c") spróbuj drugiej alternatywy, która się nie powiedzie, trzecia alternatywa się powiedzie. (caaco)

a (first from "daado") : trzeci wynik znajduje siÄ™ w drugiej alternatywie. (aad)

(*SKIP)

baabo caaco daado

caa(*SKIP)c(*FAIL)|aa.|caaco|co

[0] => aab
[1] => co
[2] => aad

Ten czasownik definiuje punkt, poza którym silnik regex nie może cofać się, gdy podpattern zawiedzie później. W związku z tym, wszystkie znaki znalezione wcześniej z podpatternem są zużywane raz na zawsze i nie mogą być użyte do innego część wzoru (alternatywa).

a (first from "baabo") : pierwszy wynik znajduje siÄ™ w drugiej alternatywie. (aab)

c (first) : Silnik regex find caac tak jak w pierwszym przypadku, następnie nie powiedzie się (przyczyna czasownika (*FAIL)), wraca do drugiego "c", ale nie może wrócić do znaków, które zostały wcześniej dopasowane ("caa") przed czasownikiem (*SKIP).
c (second) : teraz silnik regex spróbować zawsze pierwsza alternatywa, ale w tej nowej pozycji i nie powiedzie się, ponieważ nie ma " o " i nie "a" po, potem wraca do tego drugiego "c". Zauważ, że w tym przypadku znaki te nie są używane tak, jak poprzednio, ponieważ podpattern nie dotarł wcześniej do czasownika (*SKIP). Druga alternatywa jest testowana i zawodzi(nie zaczyna się na "c"). Trzecia alternatywa również zawodzi, ponieważ następny znak to "o", a nie"a". Czwarta alternatywa odnosi sukces i daje drugi wynik. (co)

a (first from "daado") : trzeci wynik znajduje siÄ™ w drugim alternatywa. (aad)

(*śliwka)

baabo caaco daado

caa(*PRUNE)c(*FAIL)|aa.|caaco|co

[0] => aab
[1] => aac
[2] => aad

Ten czasownik różni się od (*SKIP), ponieważ nie zabrania używania wszystkich poprzednich dopasowanych znaków, ale pomija pierwszy dopasowany znak przez podpattern (lub zabrania rozpoczynania od podpattern), jeśli podpattern zawiedzie później.

a (first from "baabo") : pierwszy wynik znajduje siÄ™ w drugiej alternatywie. (aab)

c (first) : Silnik regex find caac jak w pierwszym przypadku, potem zawodzi, ale teraz wraca do pierwszego " a " z "caaco", ponieważ pierwsze" c " jest pomijane.
a (first from "caaco") : pierwsza alternatywa jest wypróbowana i zawodzi, druga udaje się i daje drugi wynik. (aac)

a (first from "daado") : trzeci wynik znajduje siÄ™ w drugiej alternatywie. (aad)

 33
Author: Casimir et Hippolyte,
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
2014-08-25 22:28:47