Successivo: , Precedente: , Su: regexp Perl   [Contenuti][Indice]


B.7 Riferimenti all’indietro

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: , Precedente: , Su: regexp Perl   [Contenuti][Indice]