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?
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
)
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