Visual Basic Scripting Edition  

Alternancia y agrupamiento

Mediante la alternancia es posible utilizar el carácter '|' de modo que se pueda elegir entre dos o más alternativas. Al expandir la expresión regular del encabezado de capítulo, se pueden abarcar más elementos, no sólo los encabezados de capítulo. Sin embargo, este sistema no es tan sencillo como parece. Cuando se utiliza la alternancia, la comparación se establece con la expresión de mayor tamaño posible situada a cualquier lado del carácter '|'. Podría parecer que las siguientes expresiones para JScript y VBScript coinciden con las palabras 'Capítulo' o 'Sección', seguidas de uno o dos dígitos, que aparezcan al comienzo o al final de una línea:

/^Capítulo|Sección [1-9][0-9]{0,1}$/
"^Capítulo|Sección [1-9][0-9]{0,1}$"

Desgraciadamente, estas expresiones regulares coinciden con la palabra 'Capítulo' al comienzo de la línea o con la palabra 'Sección' (y cualquier número que siga) al final de la línea. Si la cadena de entrada es 'Capítulo 22', la expresión anterior sólo coincide con la palabra 'Capítulo'. Si la cadena de entrada es 'Sección 22', la expresión coincide con la palabra 'Sección 22'. Pero eso no era lo previsto en este caso, de modo que debe haber un método para que dicha expresión regular se ajuste mejor a lo que está intentando conseguir; de hecho, este mecanismo existe.

Puede utilizar paréntesis para limitar el ámbito de la alternancia, es decir, garantizar que sólo se aplica a las dos palabras, 'Capítulos' y 'Sección'. Sin embargo, los paréntesis también pueden provocar problemas, ya que igualmente se usan para crear subexpresiones, algo que se tratará posteriormente en la sección acerca de ellas. Si agrega paréntesis en los lugares apropiados a las expresiones regulares mostradas anteriormente, podrá conseguir que coincidan con 'Capítulo 1' y 'Sección 3'.

En las siguientes expresiones regulares se emplean paréntesis para agrupar 'Capítulo' y 'Sección', lo que permitirá que la expresión funcione correctamente. En JScript:

/^(Capítulo|Sección) [1-9][0-9]{0,1}$/

En VBScript:

"^(Capítulo|Sección) [1-9][0-9]{0,1}$"

Estas expresiones funcionarán correctamente, a menos que se produzca una interesante consecuencia. Al colocar paréntesis alrededor de 'Capítulo|Sección' se establece el agrupamiento apropiado, pero también se ocasiona que cualquiera de las dos palabras coincidentes se capturen para su uso posterior. Puesto que sólo hay un conjunto de paréntesis de la expresión anterior, sólo existe una subcoincidencia capturada. Es posible hacer referencia a esta subcoincidencia mediante la colección Submatches de VBScript o las propiedades $0$9 del objeto RegExp de JScript.

En algunas ocasiones es aconsejable capturar una subcoincidencia, en otras no. En los ejemplos anteriores, únicamente debe utilizar los paréntesis para agrupar una opción entre las palabras 'Capítulo' o 'Sección'. No es necesario que se haga referencia a dicha coincidencia posteriormente. De hecho, a menos que sea realmente necesario capturar subcoincidencias, es preferible no utilizarlas. Las expresiones regulares serán más eficaces, ya que no tendrán que utilizar el tiempo y la memoria necesarias para almacenar las subcoincidencias.

Puede usar '?:' antes del modelo de expresión regular entre paréntesis a fin de impedir que la coincidencia se guarde para su uso posterior. La siguiente modificación de las expresiones regulares anteriores proporciona la misma capacidad sin guardar la subcoincidencia. En JScript:

/^(?:Capítulo|Sección) [1-9][0-9]{0,1}$/

En VBScript:

"^(?:Capítulo|Sección) [1-9][0-9]{0,1}$"

Además de los metacaracteres '?:', hay otros dos metacaracteres de no captura empleados para lo que se denomina búsquedas anticipadas. La búsqueda anticipada positiva, especificada mediante ?=, coincide con la cadena de búsqueda en cualquier punto donde empiece un modelo de expresión regular coincidente entre paréntesis. La búsqueda anticipada negativa, especificada mediante '?!', coincide con la cadena de búsqueda en cualquier punto donde empiece una cadena que no coincida con el modelo de expresión regular.

Por ejemplo, supongamos que un documento contiene referencias a Windows 3.1, Windows 95, Windows 98 y Windows NT. Supongamos también que para actualizar el documento debe buscar todas las referencias a Windows 95, Windows 98 y Windows NT, y cambiarlas por Windows 2000. Puede utilizar la siguiente expresión regular de JScript, que constituye un ejemplo de una búsqueda anticipada positiva, para buscar Windows 95, Windows 98 y Windows NT:

/Windows(?=95 |98 |NT )/

Para conseguir la misma coincidencia en VBScript, use la siguiente expresión:

"Windows(?=95 |98 |NT )"

Una vez que se encuentre la coincidencia, la búsqueda de la coincidencia siguiente comenzará inmediatamente después del texto coincidente y no incluirá los caracteres contenidos en la búsqueda anticipada. Por ejemplo, si las expresiones mostradas anteriormente coinciden con 'Windows 98', la búsqueda se reanudará después de "Windows", no de '98'.

Ayuda de Javascript y Vbscript para Javascripts.astalaweb.com.