Probar una expresión regular

prueba una expresión regular (regex) sobre un texto y muestra las coincidencias y los grupos capturados

¿Para qué sirve un comprobador de expresión regular?

Un regex tester permite comprobar que un patrón de expresión regular (regex) coincide con el texto esperado, sin tener que lanzar el código de la aplicación. Se pega el patrón, se pega el texto de entrada, se marcan las opciones (flags) y la herramienta muestra inmediatamente la lista de coincidencias encontradas, así como los grupos capturados. Es el equivalente en línea de preg_match_all() en PHP, de String.matchAll() en JavaScript o de re.findall() en Python.

Las regex son a la vez potentes y traicioneras. Una coma, un paréntesis mal colocado, un cuantificador codicioso que absorbe demasiados caracteres: y la cadena extraída deja de ser la esperada. El comprobador evita el ida y vuelta con un editor, un terminal y un fichero de prueba: se itera el patrón hasta ver el resultado correcto.

¿Cómo escribir el patrón?

Introduzca la regex sin los delimitadores. Sin /.../, sin #...#. Por ejemplo, para capturar las direcciones de correo de un texto, introduzca únicamente [\w.+-]+@[\w-]+\.[\w.-]+. Las opciones (flags) se controlan mediante las casillas.

La opción u (Unicode) está marcada por defecto. Casi siempre es la deseada: sin ella, \w no reconoce los acentos, y algunos patrones devuelven un error PCRE silencioso en las cadenas UTF-8.

Las opciones PCRE

  • i (case-insensitive): [a-z] también reconoce las mayúsculas.
  • m (multiline): ^ y $ coinciden con los inicios y finales de cada línea, ya no solo con el inicio y el final de la cadena global.
  • s (dotall): . también reconoce los saltos de línea. Útil para patrones que deben atravesar párrafos.
  • u (unicode): interpreta el patrón y el sujeto en UTF-8. Indispensable en cuanto el texto contenga caracteres no ASCII (acentos, emoji, ideogramas).

Ejemplos de regex habituales

  • Dirección de correo: [\w.+-]+@[\w-]+\.[\w.-]+ (forma simplificada, suficiente para la mayoría de casos prácticos; la RFC 5322 estricta es muy compleja).
  • URL HTTP/HTTPS: https?://[\w.-]+(?:/[\w./?%&=-]*)?
  • Número de teléfono francés: (?:\+33|0)\s?[1-9](?:[\s.-]?\d{2}){4}
  • Código postal francés: \b\d{5}\b
  • Fecha ISO (YYYY-MM-DD): \b\d{4}-\d{2}-\d{2}\b
  • Dirección IPv4: \b(?:\d{1,3}\.){3}\d{1,3}\b
  • Palabra completa: \bfoo\b (los word boundaries evitan coincidir con football).
  • Hashtag: #\w+
  • Número de versión semántica: \d+\.\d+\.\d+(?:-[\w.-]+)?
  • Identificador de Twitter / X: @\w{1,15}

Grupos capturados

Una regex puede contener grupos entre paréntesis, que aíslan una porción del match para reutilizarla. Por ejemplo, el patrón (\w+)@(\w+\.\w+) aplicado a alice@example.com captura dos grupos: alice y example.com. La herramienta muestra esos grupos en una columna dedicada, junto a cada match. Los grupos con nombre ((?P<name>...)) también se listan, indexados por su nombre.

Para agrupar sin capturar (útil para aplicar un cuantificador sin contaminar la lista de grupos), se utiliza (?:...).

Protección frente a ReDoS

El motor PCRE de PHP puede entrar en catastrophic backtracking con algunos patrones patológicos: un patrón como (a+)+$ aplicado a una larga cadena de a no terminada puede bloquear el servidor durante varios segundos. Para evitar esa denegación de servicio por expresión regular (ReDoS), la herramienta aplica dos límites:

  • un set_time_limit(2) en el lado del worker (el tratamiento se aborta tras 2 segundos);
  • una reducción de pcre.backtrack_limit a 100 000, que hace fallar rápidamente los patrones que exploran demasiadas combinaciones.

En caso de patrón demasiado costoso, la herramienta muestra el mensaje de error PCRE (preg_last_error_msg()), típicamente Backtrack limit was exhausted. Reformule su patrón utilizando cuantificadores posesivos (a++) o grupos atómicos ((?>...)) para evitar el backtracking.

Preguntas frecuentes

¿Por qué mi regex no coincide aunque funciona en JavaScript?

El motor de esta herramienta es PCRE (PHP), cercano a Perl. La sintaxis es muy similar a la de JavaScript pero algunas funcionalidades difieren: los lookbehinds de longitud variable, ciertos alias Unicode, o la gestión por defecto de la sensibilidad a mayúsculas. Si tiene previsto ejecutar el patrón en el navegador, pruébelo también en un entorno JS.

¿Por qué mi \w no captura los acentos?

Sin el flag u, \w reconoce solo [A-Za-z0-9_]. Con u (Unicode), reconoce todas las letras según el UCD, incluidos los caracteres acentuados. Para ir más lejos, utilice las clases Unicode: \p{L} (letra), \p{N} (cifra), \p{P} (puntuación).

¿La herramienta conserva mi texto?

No. El patrón y el sujeto se procesan en RAM por el worker PHP, sin persistencia. Ningún dato enviado se registra.

¿Qué hago si recibo un mensaje "Backtrack limit was exhausted"?

Su patrón realiza demasiados retrocesos. Busque los nested quantifiers del tipo (a+)+ o (\w+)*, que son casos típicos de ReDoS. Sustitúyalos por una forma no ambigua: por ejemplo \w+ en lugar de (\w+)*.

¿Puedo probar un patrón multilínea?

Sí. Marque la opción m para que ^ y $ reconozcan los inicios y finales de cada línea. Marque además s si desea que . atraviese los saltos de línea.

Ejemplo de solicitud

curl -X POST https://cdrn.fr/api/v1/tools/regex-tester/execute \
  -H "Content-Type: application/json" \
  -d '{"pattern":"...","subject":"...","flag_i":false,"flag_m":false,"flag_s":false,"flag_u":true}'

Esquema de entrada

Campo Tipo Obligatorio Por defecto
pattern string
subject text
flag_i boolean false
flag_m boolean false
flag_s boolean false
flag_u boolean true

Puntos de acceso

  • GET https://cdrn.fr/api/v1/tools - lista todas las herramientas disponibles
  • GET https://cdrn.fr/api/v1/tools/regex-tester - recupera el esquema de esta herramienta
  • POST https://cdrn.fr/api/v1/tools/regex-tester/execute - ejecuta esta herramienta con un payload JSON