Regular Expressions
Rekursion
Sök…
Anmärkningar
Rekursion finns mest i Perl-kompatibla smaker, till exempel:
- Perl
- PCRE
- Oniguruma
- Lyft
Återge hela mönstret
Konstruktionen (?R)
motsvarar (?0)
(eller \g<0>
) - det låter dig återanvända hela mönstret:
<(?>[^<>]+|(?R))+>
Detta kommer att matcha korrekt balanserade vinkelparenteser med alla texter mellan parenteserna, som <a<b>c<d>e>
.
Återgå till en subpattern
Du kan rekrytera in i en delmönster med följande konstruktioner (beroende på smak), förutsatt att n
är ett fångstgruppsnummer och name
namnet på en fångargrupp.
-
(?n)
-
\g<n>
-
\g'0'
-
(?&name)
-
\g<name>
-
\g'name'
-
(?P>name)
Följande mönster:
\[(?<angle><(?&angle)*+>)*\]
Kommer att matcha text som: [<<><>><>]
- välbalanserade vinkelfästen inom fyrkantiga parenteser. Rekursion används ofta för balanserade konstruktionsmatchning.
Definitioner av subpattern
(?(DEFINE)
... )
-konstruktionen låter dig definiera undermönster som du kan referera senare genom rekursion. När du stöter på det i mönstret kommer det inte att matchas mot.
Denna grupp bör innehålla namngivna subpattern-definitioner, som endast är tillgängliga genom rekursion. Du kan definiera grammatik på detta sätt:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Detta mönster validerar text på följande sätt:
[42, "abc", ["foo", "bar"], 10]
Observera hur en lista kan innehålla ett eller flera värden, och ett värde kan i sig vara en lista.
Relativa gruppreferenser
Man kan referera till subpatterns med deras relativa gruppnummer:
-
(?-1)
kommer att återgå till föregående grupp -
(?+1)
kommer att återgå till nästa grupp
Också användbar med \g<N>
syntax.
Återreferenser i rekursioner (PCRE)
I PCRE hålls matchade grupper som används för backreferenser innan en rekursion i rekursionen. Men efter rekursionen återställde alla alla vad de var innan de gick in i den. Med andra ord, matchade grupper i rekursionen är alla glömda.
Till exempel:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
tändstickor
aaabba
Rekursioner är atomära (PCRE)
I PCRE spårar det inte efter den första matchen för en rekursion. Så
(?(DEFINE)(aaa|aa|a))(?1)ab
matchar inte
aab
för efter att det matchade aa
i rekursionen försöker det aldrig mer att matcha bara a
.