BrowserTools
Publicidad
Inicio / Validadores / Probador y Depurador de Regex

Probador y Depurador de Regex

Prueba expresiones regulares de JavaScript en vivo con resaltado de coincidencias, grupos de captura y vista previa de reemplazo.

Cargando Probador y Depurador de Regex… Si no ocurre nada, activa JavaScript.

Las expresiones regulares (regex o regexp) son un lenguaje formal para describir patrones en texto. La teoría se remonta al matemático Stephen Cole Kleene, que formalizó el álgebra de los lenguajes regulares en 1956, y a Ken Thompson, que implementó regex en el editor QED y en las herramientas originales de Unix grep, sed y awk en los años 60 y 70. Los motores de regex modernos amplían el fundamento teórico con funciones prácticas como las anticipaciones (lookaheads), las retrorreferencias (backreferences) y los grupos de captura con nombre, lo que las convierte en una de las herramientas de procesamiento de texto más potentes disponibles en cualquier lenguaje de programación.

Ejemplos

Entrada \b\w+@\w+\.\w+\b on "a@b.com x@y.org"
Salida 2 matches: a@b.com, x@y.org

Los grupos de captura y las banderas (g, i, m) se muestran en vivo a medida que escribes.

Preguntas frecuentes

¿Se envía mi entrada a un servidor?
No. La expresión regular se evalúa enteramente en tu navegador usando el motor nativo RegExp de JavaScript. Tu patrón, tu cadena de prueba y cualquier plantilla de reemplazo nunca salen de tu dispositivo y nunca se transmiten por la red.
¿Qué variante de regex usa esta herramienta?
Esta herramienta usa el motor de regex de JavaScript (ECMAScript) a través del constructor nativo RegExp. Admite todas las funciones estándar de ES2024, incluidos los grupos de captura con nombre (?<name>...), las aserciones de retrospección lookbehind ((?<=...) y (?<!...)), la bandera dotAll (s), la bandera Unicode (u), la bandera de índices (d) y la recién añadida bandera v para la notación de conjuntos Unicode. No admite funciones específicas de PCRE como los patrones recursivos o los cuantificadores posesivos.
¿Cuándo debería usar una regex en lugar de métodos de cadena simples?
Para búsquedas simples de cadenas fijas, String.prototype.includes() o indexOf() es más rápido y legible que una regex. Recurre a una regex cuando necesites coincidencia de patrones (p. ej., 'empieza por un dígito'), alternancia (coincidir con 'cat' o 'dog'), clases de caracteres (coincidir con cualquier vocal), cuantificadores (coincidir con uno o más dígitos) o grupos de captura para extraer subcoincidencias. La regex brilla en tareas de validación, extracción y transformación donde el patrón objetivo tiene una estructura que no puede expresarse como una sola cadena literal.
¿En qué se diferencia la regex de JavaScript de PCRE (Python, PHP, Perl)?
La variante de regex de JavaScript es similar a PCRE pero tiene algunas diferencias notables. JavaScript no admite grupos atómicos, cuantificadores posesivos ni patrones recursivos. La aserción \K (keep) disponible en PCRE está ausente en JavaScript. Los grupos de captura con nombre usan la sintaxis (?<name>...) en JavaScript, frente a (?P<name>...) en Python. La bandera global (g) en JavaScript afecta a la propiedad con estado lastIndex del objeto RegExp, lo que puede provocar errores sutiles al reutilizar un objeto regex en un bucle.
¿Cuáles son las banderas disponibles y qué hacen?
Las principales banderas de regex de JavaScript son: g (global), encontrar todas las coincidencias en lugar de detenerse en la primera; i (sin distinción entre mayúsculas y minúsculas), tratar mayúsculas y minúsculas como equivalentes; m (multilínea), hacer que ^ y $ coincidan con los límites de línea en lugar de los límites de cadena; s (dotAll), hacer que el punto (.) coincida con los saltos de línea; u (Unicode), habilitar la coincidencia Unicode completa y los escapes de punto de código; y d (índices), incluir los índices de inicio y fin de cada coincidencia y grupo de captura en el resultado.
¿Hay un límite en la longitud de la cadena de prueba o del patrón?
No hay un límite estricto impuesto por la herramienta, pero los patrones muy largos o las cadenas de prueba muy grandes pueden hacer que el navegador deje de responder, sobre todo si el patrón incluye cuantificadores anidados que pueden desencadenar un retroceso catastrófico. Los patrones con retroceso no acotado en entradas grandes pueden consumir CPU indefinidamente. Si la pestaña del navegador se congela, ciérrala y vuelve a abrirla. Para uso en producción, prueba siempre los patrones de regex contra entradas adversarias antes de desplegarlos.
¿Puedo usar esto para probar un patrón de reemplazo?
Sí. Introduce una cadena de reemplazo en el campo de reemplazo y la herramienta mostrará una vista previa en vivo de la salida tras aplicar String.prototype.replace (para la primera coincidencia) o replaceAll (con la bandera g). Se admite la sintaxis de reemplazo estándar: $1 y $2 para los grupos de captura numerados, $<name> para los grupos de captura con nombre, $& para toda la cadena coincidente, $` para el texto anterior a la coincidencia y $' para el texto posterior a la coincidencia.
¿Qué es el retroceso catastrófico y cómo lo evito?
El retroceso catastrófico ocurre cuando un motor de regex explora un número exponencial de posibles rutas de coincidencia en una cadena que no coincide con el patrón. Suele surgir de cuantificadores anidados sobre clases de caracteres que se solapan, por ejemplo, (a+)+ en una cadena larga de caracteres 'a' seguida de un carácter que no puede coincidir. Para evitarlo: prefiere patrones atómicos, usa cuantificadores posesivos si están disponibles, evita la ambigüedad en lo que puede coincidir cada parte del patrón y prueba siempre con entradas diseñadas para fallar además de entradas diseñadas para tener éxito.
¿Cuál es la diferencia entre un grupo de captura y uno sin captura?
Un grupo de captura (...) coincide con el patrón dentro de los paréntesis y almacena el texto coincidente para que pueda referenciarse después mediante $1, $2 o los índices de grupo. Un grupo sin captura (?:...) agrupa el patrón con fines de cuantificación o alternancia sin almacenar la coincidencia, lo que lo hace ligeramente más eficiente. Los grupos con nombre (?<name>...) son grupos de captura que pueden referenciarse por nombre ($<name> en los reemplazos, match.groups.name en el código JavaScript) en lugar de por índice.
¿Cuál es un error común de principiante con las expresiones regulares?
Uno de los errores más comunes es olvidar escapar el punto (.) cuando se quiere un punto literal. El punto en una regex coincide con cualquier carácter (excepto el salto de línea de forma predeterminada), así que un patrón como 3.14 también coincidirá con 3X14 o 3-14. Escribe 3\.14 para coincidir con un punto literal. Otro error frecuente es omitir la bandera global (g) y preguntarse por qué solo se resalta la primera coincidencia. Un tercer escollo es anclar con ^ y $ y sorprenderse de que coincidan con los límites de línea solo cuando la bandera multilínea (m) está activada.

Acerca de Probador y Depurador de Regex

Las expresiones regulares son indispensables para una amplia variedad de tareas del mundo real. La validación de formularios, comprobar que una dirección de correo, un número de teléfono o un código postal coinciden con el formato esperado, usa casi universalmente regex. Los analizadores de logs extraen campos estructurados de líneas de log no estructuradas usando grupos de captura. Los editores de código y los IDE usan regex para buscar y reemplazar en grandes bases de código. Las herramientas de seguridad usan regex para detectar patrones de inyección y fugas de datos sensibles. Las canalizaciones de transformación de datos usan regex para normalizar formatos inconsistentes. Las configuraciones de dispositivos de red se auditan con regex. Entender y depurar un patrón de regex de forma interactiva es mucho más rápido que ejecutar un script repetidamente.

Este probador evalúa expresiones regulares de JavaScript contra tu entrada en tiempo real, resaltando cada coincidencia a medida que escribes. Enumera todos los grupos de captura (numerados y con nombre) de cada coincidencia para que puedas ver de inmediato qué capturó cada grupo. Un modo de reemplazo te permite escribir una plantilla de reemplazo y previsualizar el resultado de String.prototype.replace o replaceAll, con soporte para las retrorreferencias $1, $2 y $<name>. Todo se ejecuta enteramente en el motor de JavaScript de tu navegador; tus patrones y tu texto de entrada nunca se envían a ningún servidor.

La regex es célebre por lo fácil que es equivocarse de forma sutil. Un punto a secas (.) coincide con cualquier carácter, incluidos los saltos de línea en algunos modos, no solo con un punto literal. Los cuantificadores codiciosos (*, +) coincidirán con todo lo posible, capturando a menudo más de lo previsto; usa las versiones perezosas (*?, +?) para coincidir con lo menos posible. Los anclajes ^ y $ coinciden con el inicio y el final de toda la cadena de forma predeterminada; añade la bandera multilínea (m) si quieres que coincidan en los límites de línea. El retroceso catastrófico, donde una regex mal escrita provoca un tiempo de coincidencia exponencial con una entrada adversaria, es un riesgo real de denegación de servicio en aplicaciones web que aplican patrones proporcionados por el usuario a texto proporcionado por el usuario.

De la teoría de lenguajes formales a grep

El concepto de las expresiones regulares se origina en la informática teórica. En 1956, el matemático Stephen Cole Kleene publicó un artículo que describía los 'eventos regulares', conjuntos de cadenas que podían describirse mediante un autómata finito, e introdujo la notación algebraica que se convertiría en la sintaxis de regex. El operador estrella (*), llamado la estrella de Kleene, lleva su nombre. En ese momento, las expresiones regulares eran puramente una abstracción matemática sin conexión con la práctica de la computación.

El salto de la teoría a la herramienta llegó en 1968, cuando Ken Thompson implementó la búsqueda con regex en el editor de texto QED y luego en la herramienta de Unix grep (cuyo nombre proviene de 'globally search a regular expression and print'). La innovación clave de Thompson fue un algoritmo eficiente que convertía una expresión regular en un autómata finito no determinista (NFA) y lo simulaba, garantizando una coincidencia en tiempo lineal sin retroceso catastrófico. Muchos motores de regex modernos abandonaron el enfoque NFA de Thompson en favor de motores con retroceso que admiten más funciones (como las retrorreferencias) pero que pueden exhibir un comportamiento exponencial en el peor de los casos.

Hoy, las expresiones regulares se admiten de forma nativa en prácticamente todos los lenguajes de programación y editores de texto. Sin embargo, la sintaxis se ha fragmentado en docenas de variantes incompatibles, POSIX BRE, POSIX ERE, PCRE, .NET, Java, Python, JavaScript, Ruby, cada una con sutiles diferencias en sintaxis y semántica. Una regex escrita para un lenguaje a menudo funcionará en otro, pero abundan los casos límite. Esta fragmentación es la razón por la que siempre se recomienda probar un patrón en el motor concreto que vayas a usar antes de desplegarlo en producción.

Publicidad
Publicidad
Publicidad