Backreference
Aggiornamento: novembre 2007
Un backreference identifica la sottostringa acquisita da un gruppo di corrispondenza in un'espressione regolare. Ogni backreference è identificato da un numero o un nome e viene utilizzato come riferimento con la notazione "\numero" o "\k<nome>". Se ad esempio nella stringa di input sono contenute più occorrenze di una sottostringa arbitraria, è possibile creare una corrispondenza della prima occorrenza con un gruppo di acquisizione, quindi utilizzare un backreference per trovare corrispondenze per le occorrenze successive della sottostringa. Per ulteriori informazioni, vedere Costrutti di backreference e Costrutti di raggruppamento.
I backreference costituiscono una valida soluzione per trovare ripetizioni di gruppi di caratteri. Possono essere considerati come un'istruzione semplificata per trovare nuovamente la stessa stringa. Per trovare, ad esempio, i caratteri adiacenti ripetuti, quali le due L nella parola "tall", si utilizzerà l'espressione regolare (?<char>\w)\k<char>, in cui viene utilizzato il metacarattere \w per trovare qualsiasi carattere a parola singola. Il costrutto di raggruppamento (?<char> ) racchiude il metacarattere per indicare al modulo di gestione delle espressioni regolari di ricordare e salvare con il nome "char" la corrispondenza verificatasi per la prima parte dell'espressione, che in questo caso sarà soddisfatta ad ogni singolo carattere. Il costrutto di riferimento alla corrispondenza memorizzata, \k<char>, indica al modulo di gestione di confrontare il carattere corrente con il carattere precedentemente memorizzato in "char". L'intera espressione regolare è pertanto soddisfatta ogni volta che un carattere è uguale al carattere precedente.
Per trovare la ripetizione di intere parole, è possibile modificare la sottoespressione di raggruppamento in modo da cercare qualsiasi gruppo di caratteri preceduto da uno spazio, invece di cercare semplicemente qualsiasi carattere singolo. È possibile sostituire la sottoespressione \w+, che corrisponde a qualsiasi gruppo di caratteri, per il metacarattere \w e utilizzare il metacarattere \s per far corrispondere uno spazio che precede il gruppo di caratteri. In tal modo si ottiene l'espressione regolare (?<char>\s\w+)\k<char>, che trova le ripetizioni di parole intere come " le le" ma crea corrispondenze anche con altre ripetizioni della stringa specificata, come nella frase " le leve".
Per verificare che la seconda corrispondenza si trovi al limite di una parola, aggiungere il metacarattere \b dopo l'espressione per la corrispondenza ripetuta. L'espressione regolare risultante (?<char>\s\w+)\k<char>\b, trova solo le ripetizioni di parole intere precedute da spazi.
Analisi dei backreference
Le espressioni da \1 a \9 si riferiscono sempre a backreference, non a codici ottali. Le espressioni a più cifre da \10 in su vengono considerate backreference se esiste un riferimento con tale numero. In caso contrario, vengono interpretate come codici ottali, a meno che le cifre iniziali non siano 8 o 9, caso in cui vengono considerate come caratteri "8" e "9" effettivi. L'inclusione di un riferimento a un numero di gruppo non definito in un'espressione regolare provoca un errore di analisi. Se l'ambiguità costituisce un problema, è possibile utilizzare la notazione \k<n>, che non è ambigua e non può essere confusa con la notazione per i numeri ottali. Analogamente, la notazione per i numeri esadecimali \xdd non è ambigua e non può essere confusa con i backreference.
Il comportamento dei backreference risulta leggermente differente se il flag di opzione ECMAScript è abilitato. Per ulteriori informazioni, vedere Confronto tra ECMAScript e il comportamento canonico di corrispondenza.
Corrispondenza dei backreference
Un riferimento a una corrispondenza memorizzata si riferisce alla definizione più recente di un gruppo (quella che si trova subito a sinistra, quando l'analisi procede da sinistra a destra). In particolare, quando un gruppo genera più catture, un riferimento a una corrispondenza memorizzata si riferisce alla cattura più recente. Ad esempio (?<1>a)(?<1>\1b)* è soddisfatta da aababb, con criterio di cattura (a)(ab)(abb). I quantificatori di cicli non cancellano le definizioni di gruppi.
Se un gruppo non ha catturato alcuna sottostringa, un riferimento a una corrispondenza memorizzata in tale gruppo risulta non definito e non verrà mai soddisfatto. L'espressione \1() ad esempio non verrà mai soddisfatta, ma l'espressione ()\1 viene soddisfatta da una stringa vuota.