Successivo: Dichiarazioni, Precedente: Ripetizione, Su: regexp Perl [Contenuti][Indice]
All’esterno di una classe di caratteri, una barra inversa seguita da una cifra maggiore di 0 (ed eventualmente da ulteriori cifre) è un riferimento all’indietro a un’espressione regolare di cattura (ossia ad un’espressione regolare che si trovi alla sua destra), ammesso che ci siano state altrettante precedenti parentesi sinistre di cattura.
Comunque, se il numero decimale che segue la barra inversa è minore di 10, è sempre considerato come un riferimento all’indietro, e causa una segnalazione di errore solo se non ci sono altrettante parentesi sinistre di cattura nell’intera espressione regolare. In altre parole, le parentesi a cui si fa riferimento non devono necessariamente essere alla sinistra del riferimento per numeri inferiori a 10. Si veda Barra inversa per ulteriori dettagli sulla gestione di cifre che seguono una barra inversa.
Un riferimento all’indietro corrisponde a qualsiasi stringa abbia soddisfatto la sotto-espressione di cattura nella stringa in esame, piuttosto che qualcosa che soddisfi l’espressione regolare stessa. Così l’espressione regolare
(sens|respons)e and \1ibility
corrisponde a ‘sense and sensibility’ e ‘response and responsibility’, ma non a ‘sense and responsibility’. Se è in vigore la corrispondenza con maiuscole/minuscole, è rilevante se le lettere sono maiuscole o minuscole. Per esempio:
((?i)blah)\s+\1
corrisponde a ‘blah blah’ e a ‘Blah Blah’, ma non a ‘BLAH blah’, anche se la sotto-espressione originale di cattura è indifferente alle maiuscole/minuscole.
Ci può essere più di un riferimento all’indietro della stessa sotto-espressione. Inoltre, se una sotto-espressione non è stata realmente usata in una particolare corrispondenza, ogni riferimento all’indietro ad essa genererà un errore. Per esempio l’espressione regolare
(a|(bc))\2
non troverà mai corrispondenze se inizia a trovare ‘a’ invece che
‘bc’. Poiché ci possono essere fino a 99 riferimenti all’indietro, tutte
le cifre che seguono la barra inversa sono considerate far parte di un
possibile riferimento all’indietro; ciò è differente da quel che accade in
modalità POSIX. Se l’espressione regolare deve proseguire con una
cifra, alcuni delimitatori devono essere usati per indicare la fine del
riferimento all’indietro. Se l’opzione modificatrice X
è impostata,
uno spazio può fare da delimitatore. Altrimenti si può utilizzare un
commento vuoto, oppure esprimere il carattere [numerico] successivo con la
notazione esadecimale od ottale. Si noti che questo vale sono per espressioni
regolari che si trovano a sinistra [LHS]; non è ancora possibile specificare
più di 9 riferimenti all’indietro sul lato destro [RHS] del comando ‘s’.
Un riferimento all’indietro posizionato all’interno delle parentesi a cui
fa riferimento genera un errore la prima volta che si usa la sotto-espressione,
per cui, per esempio, (a\1)
non avrà mai una corrispondenza. Comunque
tali riferimenti possono essere utili all’interno di sotto-espressioni ripetute.
Per esempio l’espressione regolare
(a|b\1)+
corrisponde a qualsiasi numero di ‘a’ e anche ad ‘aba’, ‘ababbaa’, etc. Ad ogni ripetizione della sotto-espressione, il riferimento all’indietro corrisponde alla stringa di caratteri trovata dalla precedente iterazione. Perché ciò possa funzionare, l’espressione deve essere tale che alla prima iterazione non sia necessario soddisfare il riferimento all’indietro. Questo può essere realizzato usando delle alternative, come nell’esempio visto sopra, oppure da un quantificatore con un minimo a zero.
Successivo: Dichiarazioni, Precedente: Ripetizione, Su: regexp Perl [Contenuti][Indice]