Backreference in JScript
I backreference vengono utilizzati per trovare gruppi di caratteri ripetuti. Vengono inoltre utilizzati per riformattare una stringa di input ridisponendo l'ordine e la posizione degli elementi nella stringa di input.
È possibile fare riferimento a una sottoespressione dall'interno di un'espressione regolare e dall'interno di una stringa di sostituzione. Ogni sottoespressione viene identificata tramite un numero e viene definita backreference.
Le parentesi vengono utilizzate in un'espressione regolare per creare una sottoespressione. La sottocorrispondenza risultante può essere recuperata dal programma. Per ulteriori informazioni, vedere Alternanza e sottoespressioni.
Utilizzo di backreference
È possibile fare riferimento a una sottoespressione dall'interno di un'espressione regolare.
In un'espressione regolare, ogni sottocorrispondenza salvata viene memorizzata nell'ordine in cui appare, da sinistra verso destra. La numerazione dei buffer in cui vengono memorizzate le sottocorrispondenze inizia con 1 fino a un massimo di 99 sottoespressioni. All'interno dell'espressione regolare, è possibile accedere a ciascun buffer tramite \n, in cui n rappresenta una o due cifre decimali che identificano un buffer specifico.
Un'applicazione di backreference consente di individuare l'occorrenza di due parole identiche esistenti nel testo. Si consideri la seguente frase: Is is the cost of of gasoline going up up?
Questa frase contiene diverse parole duplicate. Può quindi essere utile elaborare un meccanismo per correggerla senza dover cercare i duplicati di ogni parola. Nella seguente espressione regolare JScript viene utilizzata a tale scopo una singola sottoespressione.
/\b([a-z]+) \1\b/gi
La sottoespressione in questo caso costituisce tutto ciò che è incluso tra parentesi. Tale sottoespressione comprende uno o più caratteri alfabetici, come specificato da [a-z]+. La seconda parte dell'espressione regolare costituisce il riferimento alla sottocorrispondenza precedentemente salvata, ovvero la seconda occorrenza della parola di cui è stata trovata una corrispondenza mediante l'espressione tra parentesi. \1 consente di specificare la prima sottocorrispondenza.
I metacaratteri di inizio e fine di parola \b fanno in modo che vengano rilevate solo parole separate. In caso contrario, con l'espressione verrebbero erroneamente identificate frasi come "is issued" o "this is".
Nell'esempio riportato di seguito vengono elencate le parole duplicate. Mostra come è possibile recuperare corrispondenze e sottocorrispondenze nel codice.
var result;
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
// Get the first match.
result = re.exec(src);
while (result != null)
{
// Show the entire match.
print();
print(result[0]);
// Show the submatches.
for (var index = 1; index < result.length; index++)
{
print("submatch " + index + ": " + result[index]);
}
// Get the next match.
result = re.exec(src);
}
// Output:
// Is is
// submatch 1: Is
// of of
// submatch 1: of
// up up
// submatch 1: up
È inoltre possibile fare riferimento a una sottoespressione dall'interno di una stringa di sostituzione.
Utilizzando l'espressione regolare sopraindicata, nell'esempio seguente viene sostituita un'occorrenza di due parole identiche consecutive con una singola occorrenza della stessa parola. Nel metodo replace, $1 si riferisce alla prima sottocorrispondenza salvata. Se esistono più sottocorrispondenze, è possibile farvi riferimento consecutivamente come $2, $3, e così via.
var re = /\b([a-z]+) \1\b/gi
var src = "Is is the cost of of gasoline going up up?"
var result = src.replace(re, "$1");
print(result);
// Output:
// Is the cost of gasoline going up?
Nell'esempio seguente viene scambiata ogni coppia di parole nella stringa.
var re = /(\S+)(\s+)(\S+)/gi
var src = "The quick brown fox jumps over the lazy dog."
var result = src.replace(re, "$3$2$1");
print(result);
// Output:
// quick The fox brown over jumps lazy the dog.