Guías1 caza jugable incluida

Referencias inversas en regex: patrones que recuerdan lo que encontraron

Una referencia inversa como \1 coincide con el texto exacto que un grupo ya capturó. Cómo funcionan, cómo encontrar letras dobles, palabras repetidas y palíndromos, y el único lugar donde no funcionan.

Logo de Regex Hunter

· 6 min de lectura

/(.)\1/

atrapa

  • book
  • letter
  • coffee

deja libre

  • cat
  • dog
  • lemon

La mayor parte de una regex describe tipos de texto: un dígito, una letra, cualquier carácter. Una referencia inversa (backreference) es distinta. Dice “el mismo texto que encontré hace un momento”. Esa sola idea permite que un patrón corto encuentre letras dobles, palabras repetidas y palíndromos, algo que ninguna clase de caracteres puede describir.

Todos los ejemplos de abajo son interactivos. Edita el patrón o pulsa Probar para abrirlo en la Zona de pruebas.

01Primero captura, luego haz referencia

Los paréntesis hacen dos trabajos: agrupan y capturan. El texto con el que coincide un grupo se guarda, numerado de izquierda a derecha según su paréntesis de apertura. \1 significa “el texto que capturó el grupo 1”, \2 el del segundo grupo, y así sucesivamente.

Coincidencias6/6 como se esperaba
/(.)\1/

Debe coincidir3/3

  • book
  • letter
  • coffee

No debe3/3

  • cat
  • dog
  • lemon
Pruébalo en la Zona de pruebas
(.) captura un carácter, y \1 pide ese mismo carácter otra vez. Cualquier letra doble coincide.

La clave está en el mismo texto. (\w)\w significa “una letra y luego cualquier letra”, así que coincide con casi todo. (\w)\1 significa “una letra y luego exactamente esa letra otra vez”. La referencia inversa no repite el patrón del grupo. Repite el resultado.

02Palabras repetidas

Un error clásico al revisar textos es la palabra duplicada: “the the”. Captura una palabra y luego pide un espacio y la misma palabra:

Coincidencias4/4 como se esperaba
/\b(\w+) \1\b/

Debe coincidir2/2

  • this is the the end
  • it is is fine

No debe2/2

  • the then
  • that is it
Pruébalo en la Zona de pruebas
Los \b de cada extremo lo limitan a palabras completas, así que “the then” no cuenta como “the” dos veces.

Sin el \b final, the then coincidiría: the, un espacio y luego el the del principio de then.

03Empezar y terminar con la misma letra

Las anclas y una referencia inversa juntas describen la forma de una palabra:

Coincidencias6/6 como se esperaba
/^(.).*\1$/

Debe coincidir4/4

  • level
  • radar
  • stats
  • noon

No debe2/2

  • hello
  • regex
Pruébalo en la Zona de pruebas
Se captura la primera letra, .* se salta el centro y \1$ exige la misma letra justo al final.

04Palíndromos de cinco letras

Con dos grupos puedes reflejar una palabra como en un espejo. Captura las dos primeras letras, permite cualquier letra en el centro y luego exígelas de vuelta en orden inverso:

Coincidencias6/6 como se esperaba
/^(.)(.).\2\1$/

Debe coincidir4/4

  • level
  • radar
  • kayak
  • refer

No debe2/2

  • hello
  • lever
Pruébalo en la Zona de pruebas
El grupo 1 debe volver al final y el grupo 2 en el penúltimo lugar, así que la palabra se lee igual en los dos sentidos.

lever se queda cerca: empieza por le, pero termina en er, no en el.

05Comillas que forman pareja

Una referencia inversa puede asegurar que la comilla de cierre sea igual que la de apertura. (["']) captura cualquiera de las dos comillas, y \1 cierra con la misma:

Coincidencias2/2 como se esperaba
/(["']).*?\1/
  • He said "it's fine"
  • 'single' and "double"
Pruébalo en la Zona de pruebas
El apóstrofo de it's no termina la primera coincidencia, porque la cadena se abrió con comillas dobles.

06Grupos con nombre

En un patrón largo, los números son difíciles de seguir. La mayoría de los motores te dejan ponerle nombre a un grupo y referirte a él por ese nombre:

Patrón14 car.
/(?<ch>.)\k<ch>/
Pruébalo en la Zona de pruebas
La misma comprobación de letra doble que (.)\1, con el grupo llamado “ch”.

La sintaxis cambia según el lenguaje. JavaScript, .NET y PCRE usan (?<name>…) y \k<name>. El módulo re integrado de Python usa (?P<name>…) y (?P=name).

07Referencias inversas en los reemplazos

Los grupos capturados son igual de útiles cuando reemplazas texto. En la mayoría de los editores y lenguajes puedes volver a poner los grupos en otro orden: busca (\w+), (\w+) y reemplaza con $2 $1 (JavaScript, VS Code) o con \2 \1 (Python, sed) para convertir Lovelace, Ada en Ada Lovelace.

08El único lugar donde no funcionan: dentro de [ ]

Es tentador escribir (.)[^\1] para decir “un carácter seguido de otro distinto”. No funciona. Dentro de una clase de caracteres, \1 no es una referencia inversa. En JavaScript se lee como un código de carácter escapado, así que la clase significa “cualquier cosa excepto el carácter 1”:

Coincidencias2/2 como se esperaba
Las dos líneas coinciden. [^\1] no compara con la letra capturada, así que “aa” se cuela.

Para decir “no el mismo carácter”, usa un lookahead negativo: (.)(?!\1).. (Hay más sobre esto en nuestra guía de lookahead y lookbehind.)

09Pruébalo

En este tablero, cada monstruo tiene dos letras dobles distintas, como la ff y la ee de coffee. Cada inocente tiene solo una:

Caza jugablepar 12

Atrapa las palabras con dos letras dobles.

Objetivos · 0/5 atrapados

  • coffeeobjetivo
  • balloonobjetivo
  • bookkeeperobjetivo
  • committeeobjetivo
  • mississippiobjetivo

Inocentes · 0 errores

  • bookinocente
  • letterinocente
  • appleinocente
  • grassinocente
  • helloinocente

Escribe una regex: el tablero se actualiza mientras escribes.

Pruébalo en la Zona de pruebas
¿Te gustó? Cada día llega una nueva.Jugar la caza de hoy

10Referencia rápida

  • ( … ) captura. Los grupos se numeran por su paréntesis de apertura.
  • \1, \2 … coinciden con el mismo texto que capturó el grupo, no con el mismo patrón.
  • (?<name>…) con \k<name> (JS, .NET, PCRE), o (?P<name>…) con (?P=name) (Python).
  • En los reemplazos: $1 (JavaScript) o \1 (Python, sed).
  • \1 dentro de [ ] no es una referencia inversa.

11Sigue practicando