Una de las características más importantes de las expresiones regulares es la capacidad de almacenar una parte de un modelo buscado para volver a utilizarlo posteriormente. Como recordará, al poner entre paréntesis un modelo de expresión regular o una parte de un modelo, parte de la expresión se almacena en un búfer temporal. Si desea evitar que se guarde esa parte de la expresión regular, utilice los metacaracteres de no captura '?:', '?=' o '?!'.
Cada subcoincidencia capturada se almacena como se encontró de izquierda a derecha en un modelo de expresiones regulares. Los números de búfer donde se almacenan las subcoincidencias comienzan por 1 y continúan hasta un máximo de 99 subexpresiones. Se puede tener acceso a cada búfer diferente mediante '\n', donde n equivale a uno o dos dígitos decimales que identifican a un búfer específico.
Una de las aplicaciones más sencillas y útiles de las referencias inversas permite localizar la aparición de dos palabras idénticas juntas en un texto. Por ejemplo, en la siguiente frase:
¿Está está subiendo el precio de de la gasolina todavía más más?
Tal como está escrita, es evidente que en la frase anterior hay varias palabras duplicadas. Sería aconsejable diseñar una manera de corregirla sin tener que buscar los duplicados de cada una de las palabras. La siguiente expresión regular de JScript emplea una expresión única para ello.
/\b([a-z]+) \1\b/gi
La expresión equivalente de VBScript es:
"\b([a-z]+) \1\b"
En este caso, todos los elementos de la expresión están entre paréntesis. La expresión capturada incluye uno o varios caracteres alfabéticos, como se especificaba en '[a-z]+'. La segunda parte de la expresión regular es la referencia a la subcoincidencia capturada previamente, es decir, la segunda aparición de la palabra que se había encontrado justo antes con respecto a la expresión entre paréntesis. '\1' se utiliza para especificar la primera subcoincidencia. Los metacaracteres de límite de palabra garantizan que sólo se detectarán palabras independientes. Si no fuera así, esta expresión identificaría de forma incorrecta frases como "es emitido" o "esto es".
En la expresión de JScript, la etiqueta global ('g') situada tras la expresión general indica que ésta se aplica a todas las coincidencias que se puedan encontrar en la cadena de entrada. La no distinción de mayúsculas y minúsculas se especifica mediante la etiqueta de no distinción ('i') situada al final de la expresión. La etiqueta de multilínea especifica que las posibles coincidencias pueden ocurrir en cualquiera de los lados de un carácter de nueva línea. En VBScript, no es posible establecer en la expresión las distintas etiquetas, sino que deben definirse explícitamente mediante las propiedades del objeto RegExp.
Mediante la expresión regular mostrada anteriormente, el código de JScript siguiente 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 única aparición de la misma palabra:
var ss = "¿Está está subiendo el precio de de la gasolina todavía más más??.\n"; var re = /\b([a-z]+) \1\b/gim; //Crea un modelo de expresión regular. var rv = ss.replace(re,"$1"); //Reemplaza dos apariciones con una.
El código de VBScript más aproximado tendría la forma siguiente:
Dim ss, re, rv ss = "¿Está está subiendo el precio de de la gasolina todavía más más?." & vbNewLine Set re = New RegExp re.Pattern = "\b([a-z]+) \1\b" re.Global = True re.IgnoreCase = True re.MultiLine = True rv = re.Replace(ss,"$1")
Observe que en el código de VBScript, las etiquetas globales, de no distinción entre mayúsculas y minúsculas y de multilínea se establecen mediante las propiedades con el nombre apropiado del objeto RegExp.
El uso de $1 dentro del método replace hace referencia a la primera subcoincidencia guardada. Si hubiera habido más de una subcoincidencia, se haría referencia a ella consecutivamente mediante $2, $3, etc.
Otra manera de utilizar las referencias inversas consiste en dividir un indicador de recursos universal (URI, Universal Resource Indicator) en sus distintos componentes. Supongamos que desea dividir el siguiente URI en el protocolo (ftp, http, etc.), la dirección de dominio y la página o ruta de acceso:
http://www.microsoft.com/spain/scripting/default.asp
Las siguientes expresiones regulares proporcionan dicha funcionalidad. En JScript:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
En VBScript:
"(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)"
La primera subexpresión entre paréntesis se ha diseñado para capturar la parte de protocolo de la dirección Web. Esta subexpresión coincide con cualquier palabra que preceda a dos puntos y dos barras diagonales. La primera subexpresión entre paréntesis captura la parte de dirección de dominio de la dirección. Esta subexpresión coincide con cualquier secuencia de caracteres que no incluya los caracteres '^', '/' o ':'. La tercera subexpresión entre paréntesis captura el número de puerto de un sitio Web, en caso de que se haya especificado. Esta subexpresión coincide con cero o más dígitos que sigan a un signo de dos puntos. Y, finalmente, en la cuarta subexpresión entre paréntesis se captura la información de ruta de acceso y página especificada por la dirección Web. Esta subexpresión coincide con uno o varios caracteres que no sean '#' o el carácter de espacio.
Al aplicar la expresión regular al URI anterior, las subcoincidencias contienen los siguientes elementos:
RegExp.$1 contiene "http"
RegExp.$2 contiene "www.microsoft.com/spanish/"
RegExp.$3 contiene "/spain"
RegExp.$4 contiene "/scripting/default.asp"
Ayuda de Javascript y Vbscript para Javascripts.astalaweb.com. |