Referencias inversas
Una referencia inversa identifica la subcadena capturada por un grupo coincidente en una expresión regular. Las referencias inversas se identifican mediante un número o un nombre y se alude a ellas a través de la notación "\number" o "\k<name>". Por ejemplo, si la cadena de entrada contiene varias veces la misma subcadena arbitraria, puede asociar la primera aparición con un grupo de captura y, a continuación, utilizar una referencia inversa para hacerla coincidir las siguientes apariciones de la subcadena. Para obtener más información, vea Construcciones de referencia inversa y Construcciones de agrupamiento.
Las referencias inversas proporcionan un método muy útil para buscar grupos repetidos de caracteres. Pueden considerarse instrucciones abreviadas que buscan repetidamente coincidencias de la misma cadena. Por ejemplo, para buscar caracteres contiguos repetidos, como las dos eles de la palabra "tall", podría utilizarse la expresión regular (?<char>\w)\k<char>
, que emplea el metacarácter \w
para buscar cualquier carácter de palabra único. La construcción de agrupamiento (?<char> )
contiene el metacarácter que obliga a la expresión regular a "recordar" una subexpresión coincidente (que, en este caso, sería cualquier carácter único) y a guardarla con el nombre "char". La construcción de referencia inversa \k<char>
permite que el motor compare el carácter actual con el carácter coincidente anterior almacenado bajo "char". La expresión regular en su conjunto logra encontrar una coincidencia siempre que un único carácter es igual al carácter anterior.
Para buscar palabras enteras repetidas, puede modificar la subexpresión de agrupamiento de forma que busque cualquier grupo de caracteres precedidos por un espacio, en lugar de buscar simplemente cualquier carácter individual. Puede sustituir la subexpresión \w+
, que busca coincidencias de cualquier grupo de caracteres, por\w
, y utilizar el metacarácter \s
para buscar coincidencias de un espacio antepuesto al grupo de caracteres. Esto produciría la expresión regular (?<char>\s\w+)\k<char>
, que busca repeticiones de palabras enteras, como " the the", pero que encuentra también otras repeticiones de la cadena especificada, como las del sintagma "the theory".
Para comprobar que la segunda coincidencia se encuentra dentro de un límite de palabra, agregue el metacarácter \b
detrás de la cadena repetida que se va a buscar. La expresión regular resultante, (?<char>\s\w+)\k<char>\b
, busca únicamente palabras enteras repetidas que estén precedidas por un espacio en blanco.
Analizar referencias inversas
Las expresiones \1
hasta \9
aluden siempre a referencias inversas, no a códigos octales. Las expresiones de varios dígitos \11
en adelante se consideran referencias inversas si existe una referencia inversa correspondiente a ese número; en caso contrario, se interpretan como códigos octales (salvo si los dígitos iniciales son 8 o 9, en cuyo caso se consideran "8" y "9" literales). Si una expresión regular contiene una referencia inversa a un número de grupo indefinido, se considera que se ha producido un error de análisis. Si la ambigüedad constituye un problema, puede utilizar la notación \k<n>
, que no produce ambigüedades ni puede confundirse con códigos de caracteres octales; del mismo modo, los códigos hexadecimales como \xdd
tampoco son ambiguos ni pueden confundirse con las referencias inversas.
El comportamiento de las referencias inversas es ligeramente diferente cuando el indicador de la opción ECMAScript está habilitado. Para obtener más información, vea Comportamiento del motor de búsqueda de coincidencias canónico frente a ECMAScript.
Búsqueda de referencias inversas coincidentes
Una referencia inversa constituye la definición más reciente de un grupo (la definición que se encuentra más a la izquierda, cuando la búsqueda de coincidencias es de izquierda a derecha). En concreto, cuando un grupo realiza varias capturas, una referencia inversa se corresponde con la captura más reciente. Por ejemplo,(?<1>a)(?<1>\1b)*
encuentra aababb como coincidencia del patrón de captura (a)(ab)(abb)
. Los cuantificadores de bucle no borran las definiciones de grupo.
Si un grupo no captura ninguna subcadena, la referencia inversa a ese grupo no está definida y nunca coincide con ninguna cadena. Por ejemplo, la expresión \1()
nunca coincide con ninguna cadena, pero la expresión ()\1
coincide con la cadena vacía.