Referencias inversas en JScript
Actualización: noviembre 2007
Una de las características más importantes de las expresiones regulares es la capacidad de almacenar parte de un modelo coincidente para su uso posterior. Recuerde que si el modelo, o parte del modelo, de una expresión regular se incluye entre paréntesis, esa parte de la expresión se almacena en un búfer temporal. Para que no se guarde esa parte de la expresión regular, utilice los metacaracteres sin captura ?:, ?= o ?!.
Utilizar referencias inversas
Cada subcoincidencia capturada se almacena de izquierda a derecha tal como se encontró en el modelo de expresiones regulares. Los números de búfer comienzan por uno y continúan hasta un máximo de 99 subexpresiones capturadas. Se puede tener acceso a cada búfer mediante \n, donde n equivale a uno o dos dígitos decimales que identifican un búfer específico.
Una de las aplicaciones más sencillas y útiles de las referencias inversas ofrece la posibilidad de encontrar la aparición de dos palabras idénticas y adyacentes en el texto. Considere la frase siguiente:
Is is the cost of of gasoline going up up?
Esta frase contiene claramente varias palabras duplicadas. Se podría idear alguna forma de corregir esta frase sin buscar los duplicados de cada palabra. La siguiente expresión regular utiliza una única subexpresión para hacer esto:
/\b([a-z]+) \1\b/gi
La expresión capturada, como especifica [a-z]+, incluye uno o varios caracteres alfabéticos. La segunda parte de la expresión regular es la referencia a la subcoincidencia capturada previamente, esto es, la segunda aparición de la palabra que se había encontrado justo antes con respecto a la expresión entre paréntesis. \1 especifica la primera subcoincidencia. Los metacaracteres del límite de palabra garantizan que sólo se detectan palabras enteras. En caso contrario, esta expresión identificaría de forma incorrecta frases como "es emitido" o "esto es".
El indicador global (g), que va después de la expresión regular, indica que la expresión se aplica a todas las coincidencias que se puedan encontrar en la cadena de entrada. El indicador (i), situado al final de la expresión, especifica que no se hace distinción entre mayúsculas y minúsculas. El indicador multiline especifica que se pueden encontrar coincidencias en cualquiera de los lados de un carácter de nueva línea.
Mediante la expresión regular anterior, el siguiente código puede utilizar la información de subcoincidencia para reemplazar una aparición de dos palabras idénticas consecutivas en una cadena de texto con una sola aparición de la misma palabra:
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.
El uso de $1 en el método replace hace referencia a la primera subcoincidencia guardada. Si hubiera más de una subcoincidencia, se podría hacer referencia a las mismas de forma consecutiva mediante $2, $3, etc.
Las referencias inversas también pueden desglosar un URI (Universal Resource Indicator, Indicador de recursos universal) en sus distintos componentes. Supongamos que desea desglosar el siguiente URI en el protocolo (ftp, http, etc.), la dirección de dominio y la página o ruta de acceso:
https://msdn.microsoft.com:80/scripting/default.htm
La siguiente expresión regular proporciona esa funcionalidad:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
La primera subexpresión entre paréntesis captura la parte del protocolo de la dirección Web. Esa subexpresión coincide con cualquier palabra que preceda a los dos puntos y a dos barras diagonales. La segunda subexpresión entre paréntesis captura la parte de la dirección del dominio. Esa subexpresión coincide con uno o varios caracteres distintos de / o :. La tercera subexpresión entre paréntesis captura un número de puerto, si se ha especificado alguno. Esa subexpresión coincide con cero o más dígitos que sigan a un signo de dos puntos. No puede repetir esta subexpresión más de una vez. Por último, la cuarta subexpresión entre paréntesis captura la información de ruta de acceso y/o la página especificada por la dirección Web. Esa subexpresión coincide con cualquier secuencia de caracteres que no incluya los caracteres # o espacio en blanco.
Al aplicar la expresión regular al URI anterior, las subcoincidencias contienen lo siguiente:
RegExp.$1 contiene "http"
RegExp.$2 contiene "msdn.microsoft.com"
RegExp.$3 contiene ":80"
RegExp.$4 contiene "/scripting/default.htm"