Regular Expressions
ricorsione
Ricerca…
Osservazioni
La ricorsione è disponibile principalmente in aromi compatibili con Perl, come ad esempio:
- Perl
- PCRE
- Oniguruma
- Incremento
Recurse the whole pattern
Il costrutto (?R)
è equivalente a (?0)
(o \g<0>
) - ti consente di recitare l'intero modello:
<(?>[^<>]+|(?R))+>
Questo corrisponderà a parentesi angolari correttamente bilanciate con qualsiasi testo tra parentesi, come <a<b>c<d>e>
.
Recurse in subpattern
È possibile recurse in un subpattern usando i seguenti costrutti (a seconda del flavor), assumendo che n
sia un numero di gruppo di cattura e name
il nome di un gruppo di cattura.
-
(?n)
-
\g<n>
-
\g'0'
-
(?&name)
-
\g<name>
-
\g'name'
-
(?P>name)
Il seguente schema:
\[(?<angle><(?&angle)*+>)*\]
Abbinerà testo come: [<<><>><>]
- parentesi angolari ben bilanciate tra parentesi quadre. La ricorsione viene spesso utilizzata per la corrispondenza di costrutti bilanciati.
Definizioni Subpattern
Il costrutto (?(DEFINE)
... )
ti permette di definire sotto-schemi che puoi consultare in seguito attraverso la ricorsione. Quando viene incontrato nel modello, non verrà confrontato.
Questo gruppo dovrebbe contenere definizioni di subpattern denominate, che saranno accessibili solo attraverso la ricorsione. Puoi definire le grammatiche in questo modo:
(?x) # ignore pattern whitespace
(?(DEFINE)
(?<string> ".*?" )
(?<number> \d+ )
(?<value>
\s* (?:
(?&string)
| (?&number)
| (?&list)
) \s*
)
(?<list> \[ (?&value) (?: , (?&value) )* \] )
)
^(?&value)$
Questo modello convaliderà il testo come il seguente:
[42, "abc", ["foo", "bar"], 10]
Nota come un elenco può contenere uno o più valori e un valore può essere esso stesso un elenco.
Riferimenti di gruppo relativi
Subpatterns può essere referenziato con il loro numero di gruppo relativo :
-
(?-1)
si ripeterà nel gruppo precedente -
(?+1)
reciterà nel gruppo successivo
Utilizzabile anche con la sintassi \g<N>
.
Backreferences in recursions (PCRE)
In PCRE, i gruppi abbinati utilizzati per le sottorapporti prima di una ricorsione vengono conservati nella ricorsione. Ma dopo la ricorsione tornarono tutti a quello che erano prima di entrarvi. In altre parole, i gruppi corrispondenti nella ricorsione sono tutti dimenticati.
Per esempio:
(?J)(?(DEFINE)(\g{a}(?<a>b)\g{a}))(?<a>a)\g{a}(?1)\g{a}
fiammiferi
aaabba
Le ricorsioni sono atomiche (PCRE)
In PCRE, non esegue il trackback dopo che è stata trovata la prima corrispondenza per una ricorsione. Così
(?(DEFINE)(aaa|aa|a))(?1)ab
non corrisponde
aab
perché dopo averlo abbinato aa
nella ricorsione, non riproverà mai ad abbinare solo a
.