Cómo probar expresiones regulares en línea
Las expresiones regulares son una de las herramientas más poderosas en programación, y una de las más frustrantes de dominar. Un probador de regex te permite construir y depurar patrones de manera interactiva en lugar de ejecutar tu código, verificar la salida y adivinar qué salió mal. El bucle de retroalimentación pasa de minutos por iteración a segundos.
Por qué usar un probador de regex
Escribir regex en tu editor de código significa que solo ves errores en tiempo de ejecución. Un probador te muestra:
- Resaltado de coincidencias en vivo: ve exactamente qué partes de tu texto coinciden mientras escribes el patrón
- Grupos de captura: ve qué captura cada grupo sin escribir salida de depuración
- Detalles de coincidencia: posiciones exactas, longitudes y contenido de cada coincidencia
- Vista previa de reemplazo: ve el resultado de buscar-y-reemplazar antes de comprometerte con él
Cómo probar regex en línea
- Introduce tu patrón: escribe el regex en el campo de patrón. Activa banderas (g para global, i para insensible a mayúsculas, m para multilínea) según sea necesario.
- Pega tu texto de prueba: introduce el texto contra el que quieres hacer coincidir. Las coincidencias se resaltan en tiempo real.
- Ver resultados: ve todas las coincidencias con los grupos de captura listados a continuación. Usa el campo "Reemplazar con" para probar reemplazos.
Una breve historia de las expresiones regulares
Las expresiones regulares fueron formalizadas por el matemático Stephen Kleene en 1951 como una notación para "eventos regulares" en su trabajo sobre redes neuronales. Pasaron de la teoría al uso práctico cuando Ken Thompson las implementó en el editor de texto QED en Bell Labs en 1968, luego en el editor ed (1969), y finalmente en la utilidad grep (1973), cuyo nombre proviene de "global / regular expression / print."
Perl, introducido por Larry Wall en 1987, expandió significativamente la sintaxis de regex: cuantificadores no codiciosos, lookahead, grupos nombrados, atajos de clases de caracteres como \d y \w. La biblioteca Perl-Compatible Regular Expressions (PCRE), lanzada en 1997, se convirtió en el estándar de facto para la mayoría de los lenguajes modernos.
Hoy, virtualmente todo lenguaje de programación tiene soporte regex incorporado, aunque la sintaxis varía ligeramente. El motor JavaScript (V8 en Chrome, SpiderMonkey en Firefox) está altamente optimizado y alimenta la mayoría de los probadores regex en línea. PHP, Python (módulo re) y Java (java.util.regex) usan sintaxis estrechamente relacionada pero no idéntica. Saber para qué sabor estás escribiendo importa para las características avanzadas.
Patrones regex comunes que vale la pena conocer
Dirección de correo electrónico (básico):
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
URL:
https?://[^\s]+
Número de teléfono (US):
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
Fecha (AAAA-MM-DD):
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])
Dirección IP (IPv4):
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
Código de color hex:
#(?:[0-9a-fA-F]{3}){1,2}\b
Slug (identificador apto para URL):
^[a-z0-9]+(?:-[a-z0-9]+)*$
Cadena con espacios eliminados:
^\s*(.*?)\s*$
Diferencias de sabor entre lenguajes
La sintaxis regex es mayormente portátil pero tiene trampas:
- JavaScript: lookbehinds agregados en ES2018 (
(?<=...),(?<!...)), compatible con Chrome 62+, Firefox 78+, Safari 16.4+. Grupos nombrados a través de(?<nombre>...). - Python: el módulo
readmite casi todas las características de Perl; el paquete de tercerosregexagrega aún más (lookbehind de longitud variable, coincidencia difusa). - Java:
\bpara límite de palabra funciona igual; los grupos nombrados usan(?<nombre>...). Patrón Pattern.compile + matcher. - PHP: la familia
preg_matchusa PCRE bajo el capó. Los patrones requieren delimitadores:/patrón/banderas. - Go: usa sintaxis RE2 (sin referencias hacia atrás, sin lookaround) para rendimiento lineal garantizado. Algunos patrones que funcionan en JS/PCRE fallan en Go.
- Rust: el crate
regexusa RE2 por defecto; el cratefancy-regexagrega lookaround.
Cuando escribas un regex en un probador (casi siempre sabor JavaScript), confirma que el lenguaje objetivo admite todas las características que usaste antes de comprometerte con él.
Errores comunes
- Backtracking catastrófico: patrones como
(a+)+bcontraaaaaaaaaaaaaaaaaaaaaaaaacpueden tomar tiempo exponencial. El motor regex prueba cada agrupación posible. Usa cuantificadores posesivos ((a++)+) o grupos atómicos(?>a+)+para prevenir esto. RE2 y Go regex son inmunes por diseño. - Cuantificadores codiciosos vs perezosos:
a.*bcoincide tanto como sea posible (codicioso);a.*?bcoincide tan poco como sea posible (perezoso). Confundir uno con el otro es la fuente #1 de "mi regex coincide demasiado." - Anclas en modo multilínea:
^y$coinciden con inicio/fin de cadena por defecto. Con la banderam, coinciden con inicio/fin de cada línea. Olvidar esto da resultados incompletos. - Caracteres especiales en clases de caracteres: dentro de
[...], la mayoría de los caracteres especiales pierden su significado.[.]coincide con un punto literal. Pero],\y^(al inicio) aún necesitan escape. - Unicode y
\w:\wes[A-Za-z0-9_]en la mayoría de los sabores, por lo que NO coincide con letras acentuadas comoéo scripts no latinos. Usa\p{L}(escape de propiedad Unicode) o pasa la banderauen JS. - Olvidar la bandera global: sin
g, métodos comoString.matchAll()lanzan, y.replace()solo reemplaza la primera coincidencia. El probador usa global por defecto, pero tu código real puede no hacerlo. - Anclaje de validación de entrada completa:
^foo$garantiza que toda la entrada sea "foo." Sin las anclas,foocoincide en cualquier parte de la cadena, lo cual es un riesgo de seguridad en validación de entrada.
Cuándo NO usar regex
Regex es la herramienta equivocada para algunos trabajos:
- Analizar HTML o XML: estructuras anidadas, atributos y espacios arbitrarios hacen que regex sea poco práctico. Usa un analizador adecuado (DOMParser, BeautifulSoup, lxml).
- Analizar JSON: misma razón. Usa
JSON.parse()o equivalente. - Analizar código fuente: los analizadores AST (Acorn, Esprima, AST-grep) entienden la sintaxis. Regex solo ve texto.
- Validación de correo electrónico: el regex de correo válido RFC 5322 tiene más de 6.000 caracteres. Para validación real, envía un correo de confirmación en su lugar.
- Reglas de fuerza de contraseña: patrones regex complejos para "debe contener mayúscula, minúscula, dígito, carácter especial" son difíciles de mantener. Compón múltiples comprobaciones simples en su lugar.
Si te encuentras escribiendo un regex de más de 100 caracteres con múltiples grupos anidados, probablemente estés resolviendo el problema equivocado.
Consejos para escribir mejor regex
- Empieza simple: haz que un patrón básico funcione primero, luego agrega complejidad. Intentar escribir el regex perfecto de una sola vez rara vez funciona.
- Usa la bandera global (g): sin ella, el probador se detiene en la primera coincidencia. Con
g, ves todas las coincidencias en el texto. - Prueba casos límite: tu regex podría coincidir con los casos obvios pero fallar en cadenas vacías, caracteres especiales o condiciones límite. Agrégalos a tu texto de prueba.
- Escapa caracteres especiales: caracteres como
.,*,+,?,(,),[,],{,},\,^,$y|tienen significado especial en regex. Para coincidirlos literalmente, prefija con una barra invertida. - Usa grupos no capturantes: si necesitas paréntesis para agrupación pero no necesitas la captura, usa
(?:...)en lugar de(...). Esto mantiene tus resultados de coincidencia más limpios. - Comenta patrones complejos: la mayoría de los sabores admiten la bandera
x(modo extendido), que permite espacios y# comentariosdentro del patrón. Úsala para regex de más de 50 caracteres. - Guarda tus pruebas: un regex que funciona en tu texto de prueba hoy debería funcionar en entradas similares para siempre. Guarda los casos de prueba junto al regex en tu base de código como documentación.
Privacidad y datos de prueba confidenciales
El probador regex se ejecuta completamente en tu navegador usando el motor RegExp nativo de JavaScript. El patrón que escribes, el texto de prueba que pegas y las coincidencias que ves permanecen todos en tu dispositivo. Nada se sube, registra o analiza por ningún servidor.
Esto importa porque el texto de prueba regex a menudo contiene información sensible: muestras de logs de producción (con IDs de usuario reales, direcciones IP, tokens de sesión), listas de correo extraídas de un CRM, datos de cliente formateados de manera inusual. Los probadores regex en la nube enrutan todo esto a través de sus servidores, a veces guardándolo con fines de "mejora." Un probador basado en navegador tiene cero exposición para cualquiera de estos.
Preguntas frecuentes
¿Mi regex funcionará en otros lenguajes de programación?
La mayor parte de la sintaxis regex se comparte entre JavaScript, Python, Java, PHP y otros. Los patrones básicos (clases de caracteres, cuantificadores, anclas) funcionan en todas partes. Algunas funcionalidades avanzadas como lookbehinds o grupos con nombre difieren según el lenguaje.
¿Se envían mis datos de prueba a un servidor?
No. Toda la coincidencia se hace localmente en tu navegador con el motor RegExp nativo de JavaScript. Nada se envía a otro sitio.
¿Puedo probar sustituciones?
Sí. Introduce un patrón de sustitución (usando $1, $2, etc. para los grupos de captura) para ver el resultado de un buscar-reemplazar en tiempo real.
¿Funciona sin conexión?
Sí. Una vez cargada la página, la herramienta funciona íntegramente en tu navegador sin conexión a Internet.