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 .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow