Backreference in JScript

Aggiornamento: novembre 2007

Una delle principali funzionalità delle espressioni regolari è costituita dalla possibilità di memorizzare parte di un criterio di ricerca per un utilizzo successivo. Come accennato in precedenza, l'inserimento tra parentesi di un criterio di ricerca di un'espressione regolare o di parte di un criterio determina la memorizzazione di tale parte dell'espressione in un buffer temporaneo. È possibile eseguire l'override dell'acquisizione utilizzando i metacaratteri di non acquisizione ?:, ?= o ?!.

Utilizzo di backreference

Ogni sottocorrispondenza acquisita viene memorizzata nell'ordine in cui appare, da sinistra verso destra, in un criterio di ricerca di un'espressione regolare. La numerazione dei buffer inizia con 1 fino a un massimo di 99 sottoespressioni acquisite. È possibile accedere a ciascun buffer utilizzando \n, dove n rappresenta una o due cifre decimali che identificano un buffer specifico.

Una delle applicazioni più semplici e utili dei backreference consente di individuare l'occorrenza di due parole identiche consecutive nel testo. Si consideri la seguente frase:

Is is the cost of of gasoline going up up?

La frase contiene evidentemente più parole duplicate. Può quindi essere opportuno elaborare un meccanismo per correggerla senza cercare i duplicati di ogni singola parola. Nella seguente espressione regolare viene utilizzata a tale scopo una singola sottoespressione:

/\b([a-z]+) \1\b/gi

L'espressione acquisita, specificata da [a-z]+, comprende uno o più caratteri alfabetici. La seconda parte dell'espressione regolare costituisce un riferimento alla sottocorrispondenza precedentemente acquisita, ovvero la seconda occorrenza della parola di cui è stata trovata una corrispondenza mediante l'espressione tra parentesi. \1 specifica la prima sottocorrispondenza. I metacaratteri di inizio e fine di parola assicurano che vengano rilevate solo parole intere. In caso contrario, con l'espressione verrebbero erroneamente identificate frasi come "is issued" o "this is".

Il flag globale (g) che segue l'espressione regolare indica che l'espressione viene applicata al massimo numero di corrispondenze che è possibile trovate nella stringa di input. Il flag (i) alla fine dell'espressione specifica che non viene applicata la distinzione tra maiuscole e minuscole. Il flag multiline specifica che le eventuali corrispondenze possono essere riportate sia prima che dopo un carattere di nuova riga.

Utilizzando l'espressione sopra riportata, nel seguente codice è possibile utilizzare le informazioni relative alla sottocorrispondenza per sostituire l'occorrenza di due parole identiche consecutive in una stringa di testo con una singola occorrenza della stessa parola:

var ss = "Is is the cost of of gasoline going up up?.\n";
var re = /\b([a-z]+) \1\b/gim;       //Create regular expression pattern.
var rv = ss.replace(re,"$1");   //Replace two occurrences with one.

L'utilizzo di $1 nel metodo replace si riferisce alla prima sottocorrispondenza salvata. Se si dispone di più sottocorrispondenze, è possibile farvi riferimento consecutivamente utilizzando $2, $3 e così via.

I backreference consentono inoltre di suddividere un URI (Universal Resource Indicator) nelle diverse parti che lo compongono. Si supponga ad esempio di voler suddividere il seguente URI in protocollo (ftp, http e così via), indirizzo di dominio e pagina/percorso:

https://msdn.microsoft.com:80/scripting/default.htm

Per ottenere questo risultato è possibile utilizzare la seguente espressione regolare:

/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/

La prima sottoespressione tra parentesi acquisisce la parte dell'indirizzo Web relativa al protocollo. La sottoespressione corrisponde a qualsiasi parola che precede un segno di due punti e due barre. La seconda sottoespressione tra parentesi acquisisce la parte dell'indirizzo relativa all'indirizzo di dominio. La sottoespressione corrisponde a uno o più caratteri diversi da / o :. La terza sottoespressione tra parentesi acquisisce il numero di porta eventualmente specificato. La sottoespressione corrisponde a una o più cifre dopo un segno di due punti. Non è possibile ripetere questa sottoespressione più di una volta. La quarta espressione tra parentesi acquisisce infine le informazioni relative al percorso e/o alla pagina specificate nell'indirizzo Web. La sottoespressione corrisponde a qualsiasi sequenza di caratteri non comprendente i caratteri # o i caratteri spazio.

Se si applica l'espressione regolare all'URI sopra riportato, le sottocorrispondenze conterranno le seguenti stringhe:

  • RegExp.$1 contiene "http"

  • RegExp.$2 contiene "msdn.microsoft.com"

  • RegExp.$3 contiene ":80"

  • RegExp.$4 contiene "/scripting/default.htm"

Vedere anche

Altre risorse

Introduzione alle espressioni regolari