Regular Expressions
Rekurencja
Szukaj…
Uwagi
Rekursja jest dostępna głównie w wersjach zgodnych z Perlem, takich jak:
- Perl
- PCRE
- Oniguruma
- Podnieść
Powtórz cały wzór
Konstrukt (?R)
jest równoważny z (?0)
(lub \g<0>
) - pozwala powtórzyć cały wzorzec:
<(?>[^<>]+|(?R))+>
Spowoduje to dopasowanie odpowiednio wyważonych nawiasów kątowych do dowolnego tekstu między nawiasami, np. <a<b>c<d>e>
.
Wróć do subpatternu
Możesz wrócić do wzorca za pomocą następujących konstrukcji (w zależności od smaku), zakładając, że n
jest numerem grupy przechwytywania i name
nazwę grupy przechwytywania.
-
(?n)
-
\g<n>
-
\g'0'
-
(?&name)
-
\g<name>
-
\g'name'
-
(?P>name)
Następujący wzór:
\[(?<angle><(?&angle)*+>)*\]
Dopasuje tekst, taki jak: [<<><>><>]
- dobrze wyważone nawiasy kątowe w nawiasach kwadratowych. Rekurencja jest często używana do zrównoważonych dopasowywania konstrukcji.
Definicje subpattern
Konstrukcja (?(DEFINE)
... )
pozwala definiować wzorce, do których można się później odwoływać poprzez rekurencję. Kiedy napotkał we wzorcu nie będą porównywane.
Ta grupa powinna zawierać nazwane definicje subpattern, które będą dostępne tylko poprzez rekurencję. W ten sposób możesz zdefiniować gramatykę:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Ten wzór sprawdzi poprawność tekstu w następujący sposób:
[42, "abc", ["foo", "bar"], 10]
Zwróć uwagę, jak lista może zawierać jedną lub więcej wartości, a sama wartość może być listą.
Względne odniesienia do grup
Wzorce pomocnicze można odnosić do ich względnego numeru grupy:
-
(?-1)
powróci do poprzedniej grupy -
(?+1)
powróci do następnej grupy
Można go także używać ze składnią \g<N>
.
Referencje wsteczne w rekurencjach (PCRE)
W PCRE dopasowane grupy używane dla odwołań wstecznych przed rekurencją są przechowywane w rekurencji. Ale po rekursji wszyscy resetują się do tego, czym byli przed wejściem w to. Innymi słowy, dopasowane grupy w rekursji są zapomniane.
Na przykład:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
mecze
aaabba
Rekurencje są atomowe (PCRE)
W PCRE nie jest śledzony po znalezieniu pierwszego dopasowania dla rekurencji. Więc
(?(DEFINE)(aaa|aa|a))(?1)ab
nie pasuje
aab
bo po to dopasowane aa
w rekursji, nigdy nie spróbować jeszcze raz, aby dopasować tylko . a