Prueba expresiones regulares en tres motores reales
Las expresiones regulares parecen iguales en todas partes, pero cada motor tiene su propio dialecto. Un patrón que funciona
en la consola de tu navegador puede fallar en un script de Python o en una regla de nginx. Este probador ejecuta tu patrón
en el motor que realmente vas a usar: JavaScript (el RegExp nativo de tu navegador),
Python (sintaxis y mensajes de error de re) y PCRE2, la biblioteca que hay
detrás de las funciones preg_* de PHP, nginx, Apache y grep -P. Las coincidencias se resaltan
mientras escribes, cada grupo de captura aparece con su posición y puedes previsualizar sustituciones.
Diferencias clave entre motores
- Grupos con nombre: el
rede Python exige(?P<nombre>…); JavaScript usa(?<nombre>…)y PCRE acepta ambas formas. - Reemplazos: JavaScript escribe
$1y$<nombre>, Python\1y\g<nombre>, PCRE$1y${nombre}. - El modo verbose (
x), que ignora espacios y permite comentarios, existe en Python y PCRE pero no en JavaScript. - Cuantificadores posesivos y grupos atómicos (
a++,(?>…)) están disponibles en PCRE y en Python 3.11+, no en JavaScript.
Protegido frente al backtracking catastrófico
Los patrones con cuantificadores anidados como (a+)+$ o (a|aa)+$ pueden tardar un tiempo
exponencial con ciertas entradas, una debilidad conocida como ReDoS. Esta herramienta detiene cualquier evaluación que dure
más de un segundo –el motor de JavaScript se ejecuta en un Web Worker que se termina, el de Python tiene un límite de
tiempo estricto y PCRE2 aplica su límite de backtracking– y te avisa de que el patrón es peligroso. Si ocurre aquí, también
puede ocurrir en tu servidor de producción.
Ejemplos prácticos
^\d{4}-\d{2}-\d{2}$: una fecha ISO como 2026-11-11.(?<user>[\w.+-]+)@(?<domain>[\w-]+\.[\w.]+): separa un correo en usuario y dominio.\b(?:\d{1,3}\.){3}\d{1,3}\b: encuentra direcciones con aspecto de IPv4 en un log.
Los patrones de JavaScript nunca salen de tu navegador. Los de Python y PCRE se evalúan en nuestro servidor y se descartan
de inmediato; tu último patrón y texto solo se recuerdan en el localStorage de tu navegador.