Explicador de Expresiones Regulares

Descomponga expresiones regulares complejas en estructuras AST claras y comprensibles en lenguaje natural. Inspeccione categorías de tokens, trace recorridos ferroviarios secuenciales, evalúe la complejidad de retroceso ReDoS y verifique el comportamiento en tiempo real.

Patrón de Expresión Regular/g
//g
Texto de Prueba0 coincidencias
Líneas:3
Longitud:67 caracteres
^Inicio de cadena / línea (^)

Afirma la posición al inicio absoluto del texto

Aserción de ancho cero; no consume ningún carácter.

(?<user>[a-zA-Z0-9._%+-]+)Grupo de captura con nombre (?<user>...)

Grupo de captura con nombre "user"

Dentro de este grupo:

[a-zA-Z0-9._%+-]+Clase de caracteres [a-zA-Z0-9._%+-]
Repeticiones: +

Uno o más caracteres: letras, dígitos, . _ % + -

Permite: letras (a-z, A-Z), dígitos decimales (0-9), caracteres especiales: . % +.

@Carácter literal '@'

Carácter literal '@'

(?<domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})Grupo de captura con nombre (?<domain>...)

Grupo de captura con nombre "domain"

Dentro de este grupo:

[a-zA-Z0-9.-]+Clase de caracteres [a-zA-Z0-9.-]
Repeticiones: +

Uno o más caracteres: letras, dígitos, puntos o guiones

Permite: letras (a-z, A-Z), dígitos decimales (0-9), caracteres especiales: ..

\.Punto escapado (\.)

Punto literal (escapado)

[a-zA-Z]{2,}Clase de caracteres [a-zA-Z]
Repeticiones: {2,}

Al menos 2 caracteres: letras

Permite: letras (a-z, A-Z).

$Fin de cadena / línea ($)

Afirma la posición al final absoluto del texto

Aserción de ancho cero; coincide antes del salto de línea o al final de la entrada.

Modo de Vista:breakdown

Todo el análisis sintáctico, visualización y evaluación de expresiones regulares se ejecuta 100% en local en su navegador. Sus expresiones nunca salen de su dispositivo.

Flujo de Trabajo Paso a Paso para el Análisis de Expresiones Regulares

Paso 1

Ingresar expresión y delimitadores

Pegue o escriba su expresión regular entre los delimitadores /.../, o seleccione una plantilla prediseñada desde el menú de opciones predefinidas.

Paso 2

Configurar modificadores de ejecución

Active o desactive modificadores como global (g), no distinguir mayúsculas (i), multilínea (m), dotAll (s), Unicode (u) o índices (d) para ajustar el ámbito del motor de búsqueda.

Paso 3

Analizar el desglose jerárquico de tokens

Examine las tarjetas detalladas del AST que revelan límites exactos de cuantificadores, clases de caracteres, posiciones de anclaje y jerarquías de grupos de captura anidados.

Paso 4

Trazar el flujo ferroviario y probar coincidencias

Siga la canalización de coincidencia secuencial en las pistas del diagrama ferroviario, verifique casos límite en el entorno de pruebas en tiempo real y exporte documentación en formato de árbol o Markdown.

Patrones de Producción y Recorridos por el Árbol AST

Modelos descompuestos que muestran jerarquía de tokens, propósito de coincidencia y restricciones de límites estructurales:

1. Validador de Correo Electrónico y Dominio (RFC 5322)

Modificadores: /g

Separa los identificadores de destinatario de los dominios anfitriones con anclajes estrictos de inicio (^) y fin ($), previniendo coincidencias parciales arbitrarias.

Expresión Regular
/^(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/g
Texto de Prueba Válido
developer.ops+v2@cloud.service.internal
Descomposición de Tokens en el AST
TokenTipo de NodoRegla de Ejecución del Analizador
^ / $AnclajesAfirma los límites absolutos de inicio y fin de la cadena para impedir coincidencias parciales no deseadas.
(?<user>[a-zA-Z0-9._%+-]+)Grupo con NombreCaptura el nombre de usuario del buzón en la variable "user" utilizando caracteres válidos de RFC.
@LiteralSeparador obligatorio único que aísla el identificador de usuario del dominio anfitrión.
(?<domain>[a-zA-Z0-9.-]+)Grupo con NombreCaptura la jerarquía de dominio y subdominios del servidor anfitrión en la variable "domain".
\.Punto EscapadoCoincide con el punto literal que separa las etiquetas de dominio de la extensión de nivel superior.
[a-zA-Z]{2,}Clase AcotadaExige 2 o más caracteres alfabéticos para el dominio de nivel superior (TLD).

2. Analizador de Identificadores de Recursos Uniformes (URI RFC 3986)

Modificadores: /gi

Aísla el esquema de protocolo, autoridad de host, puerto opcional, ruta de recurso y cadena de consulta sin riesgos de retroceso catastrófico.

Expresión Regular
/^https?:\/\/(?<host>[a-zA-Z0-9.-]+)(?::(?<port>\d+))?(?<path>\/[^\s?#]*)?(?:\?(?<query>[^\s#]*))?$/gi
Texto de Prueba Válido
https://api.cluster.io:8443/v2/metrics?filter=active&limit=50
Descomposición de Tokens en el AST
TokenTipo de NodoRegla de Ejecución del Analizador
https?Secuencia CuantificadaCoincide con "http" seguido de una "s" opcional mediante el cuantificador codicioso ?.
:\/\/Literales EscapadosCoincide con el delimitador de autoridad del protocolo "://" con barras diagonales debidamente escapadas.
(?<host>[a-zA-Z0-9.-]+)Grupo con NombreCaptura el nombre de dominio totalmente cualificado (FQDN) o dirección IP en la variable "host".
(?::(?<port>\d+))?No Captura OpcionalEvalúa el grupo de puerto TCP opcional sin consumir índices de captura; almacena los dígitos en "port".
(?<path>\/[^\s?#]*)?Grupo OpcionalCoincide con una ruta opcional que comienza con / y consume caracteres válidos que no sean separadores.
(?:\?(?<query>[^\s#]*))?Grupo OpcionalCoincide con el prefijo ? de parámetros y captura la carga útil de consulta en la variable "query".

3. Marca de Tiempo de Calendario con Zona Horaria (ISO 8601)

Anclada

Valida fechas de calendario, restricciones horarias de 24 horas, fracciones de milisegundos opcionales y desfases UTC con rangos estrictos de alternancia.

Expresión Regular
/^(?<year>\d{4})-(?<month>0[1-9]|1[0-2])-(?<day>0[1-9]|[12]\d|3[01])T(?<time>[01]\d|2[0-3]):(?<minute>[0-5]\d):(?<second>[0-5]\d)(?:\.(?<ms>\d{3}))?(?<tz>Z|[+-][01]\d:?[0-5]\d)$/
Texto de Prueba Válido
2026-09-16T18:30:00.124+02:00
Descomposición de Tokens en el AST
TokenTipo de NodoRegla de Ejecución del Analizador
(?<year>\d{4})Cuantificador con NombreExige exactamente cuatro dígitos decimales que representan el año del calendario gregoriano.
-(?<month>0[1-9]|1[0-2])Grupo con AlternanciaGuion seguido de ramas de mes de calendario mutuamente excluyentes: 01–09 o 10–12.
-(?<day>0[1-9]|[12]\d|3[01])Grupo con AlternanciaGuion seguido de ramas de validación de días: 01–09, 10–29 o 30–31.
T(?<time>[01]\d|2[0-3])Literal y AlternanciaDesignador ISO 8601 "T" seguido de validación de horas en formato de 24 horas: 00–19 o 20–23.
:(?<minute>[0-5]\d):(?<second>[0-5]\d)Secuencias EmparejadasDos puntos delimitando secuencias de dos dígitos para minutos y segundos (00–59).
(?<tz>Z|[+-][01]\d:?[0-5]\d)Grupo de Zona HorariaCaptura el designador UTC Zulú (Z) o desfases horarios explícitos con signo.

4. Especificación de Versiones Semánticas (SemVer 2.0.0)

Anclada

Exige versiones enteras positivas sin ceros a la izquierda mientras analiza canales preliminares opcionales y metadatos de compilación.

Expresión Regular
/^v?(?<major>0|[1-9]\d*)\.(?<minor>0|[1-9]\d*)\.(?<patch>0|[1-9]\d*)(?:-(?<prerelease>[0-9A-Za-z.-]+))?(?:\+(?<build>[0-9A-Za-z.-]+))?$/
Texto de Prueba Válido
v2.14.0-rc.3+build.892
Descomposición de Tokens en el AST
TokenTipo de NodoRegla de Ejecución del Analizador
^v?Prefijo OpcionalAfirma el límite inicial y admite un prefijo opcional de etiqueta de versión "v".
(?<major>0|[1-9]\d*)Alternancia DisjuntaRechaza ceros iniciales ilegales: acepta el literal 0 o un entero positivo que comience en 1-9.
\.(?<minor>...)\.(?<patch>...)Jerarquía DelimitadaExige separadores de punto literal entre componentes enteros menor y de parche.
(?:-(?<prerelease>[0-9A-Za-z.-]+))?Etiqueta PreliminarCoincide con un prefijo de guion opcional seguido de identificadores alfanuméricos con puntos.
(?:\+(?<build>[0-9A-Za-z.-]+))?$Metadatos de CompilaciónCoincide con un prefijo más opcional y hash de compilación hasta el límite de final de cadena.

Taxonomía de Tokens y Matriz de Referencia Gramatical de Regex

Los bloques fundamentales de construcción reconocidos por los analizadores de expresiones regulares de ECMAScript moderno:

Sintaxis del TokenClasificación GramaticalSemántica del Analizador y Características de Coincidencia
^ / $Anclas de Cadena / LíneaAserciones de ancho cero que coinciden con el inicio (^) o fin ($) del búfer completo. En modo multilínea (m), coinciden inmediatamente después o antes de saltos de línea (\n).
\b / \BLímites de Palabra\b coincide con una posición de ancho cero entre un carácter de palabra (\w) y uno que no lo es (\W). \B afirma la posición inversa de no límite.
.Carácter ComodínCoincide con cualquier unidad de código UTF-16 individual excepto terminadores de línea (\n, \r). Con el modificador dotAll (s) activo, coincide incondicionalmente con todos los caracteres.
\d / \DAbreviaturas Numéricas\d coincide con cualquier dígito decimal equivalente a [0-9]. La mayúscula \D coincide con cualquier carácter no numérico equivalente a [^0-9].
\w / \WAbreviaturas de Palabra\w coincide con letras ASCII, dígitos y guion bajo [a-zA-Z0-9_]. La mayúscula \W coincide con cualquier carácter fuera de este conjunto.
\s / \SEspacios en Blanco\s coincide con espacios ASCII y Unicode: espacios, tabulaciones (\t), saltos de página (\f) y saltos de línea (\n, \r). \S niega el espacio en blanco.
[a-z0-9] / [^...]Clases de CaracteresDefine un conjunto explícito de caracteres individuales permitidos. Los guiones (-) establecen rangos continuos de puntos de código. El circunflejo inicial ([^...]) niega el conjunto, coincidiendo con cualquier carácter ausente en la lista.
* / + / ? / {n,m}Cuantificadores Codiciosos* coincide 0 o más veces; + coincide 1 o más veces; ? coincide 0 o 1 vez; {n,m} coincide entre n y m repeticiones. Se evalúan de forma codiciosa consumiendo el máximo número de caracteres antes de iniciar el retroceso.
*? / +? / ?? / {n,m}?Cuantificadores PerezososAñade un signo de interrogación a los cuantificadores estándar. Invierte la prioridad de evaluación para consumir el menor número de caracteres posible, expandiéndose únicamente cuando los tokens posteriores no coinciden.
(...) / (?<nombre>...)Grupos de CapturaAísla subpatrones y asigna ranuras de memoria indexadas en la matriz de resultados ($1, $2) o entradas de diccionario con nombre (match.groups.nombre) para extracción y referencias inversas.
(?:...)Grupos sin CapturaEstablece precedencia de operadores y alcance de cuantificadores sin crear ranuras de índice ni reservar búferes de captura, eliminando sobrecarga en tiempo de ejecución.
(?=...) / (?!...)Lookaheads (Aserciones Hacia Adelante)Aserciones de ancho cero que verifican si el subpatrón coincide (?= positiva) o falla (?! negativa) inmediatamente después del índice actual sin consumir texto.
(?<=...) / (?<!...)Lookbehinds (Aserciones Hacia Atrás)Aserciones de ancho cero que inspeccionan los caracteres inmediatamente anteriores al cursor actual (?<= positiva, ?<! negativa). Motores modernos como V8 admiten longitud variable en lookbehinds.
\p{Category}Escapes de Propiedad UnicodeCoincide con puntos de código según la base de datos oficial de propiedades Unicode (p. ej. \p{Letter}, \p{Emoji}, \p{Script=Greek}). Requiere el modificador u o v.

Arquitectura de Compiladores: Cómo Construyen los Motores el Árbol AST

La compilación de una expresión regular transforma patrones de texto arbitrarios en grafos sintácticos estructurados. El motor resuelve la precedencia gramatical antes de iniciar la evaluación del texto:

1. Tokenización Léxica

El analizador léxico identifica tokens atómicos como literales escapados, corchetes, paréntesis y símbolos de repetición. Las secuencias de escape (\\d, \\.) se resuelven en nodos de clase de caracteres o literales individuales, desacoplando los delimitadores de formato de la lógica del patrón.

2. Análisis por Descenso Recursivo

Los paréntesis de apertura activan subrutinas de análisis recursivo que determinan el tipo de grupo (con nombre, sin captura o aserciones lookaround). Las estructuras anidadas incrementan la propiedad de profundidad del nodo, garantizando que los límites de cuantificación internos no afecten a las expresiones superiores.

3. Vinculación de Cuantificadores en el AST

Los cuantificadores (*, +, {m,n}) se vinculan estrictamente al nodo AST inmediatamente anterior. Si el predecesor es un grupo parentético cerrado, el cuantificador engloba todo el subárbol; si hay una alternancia, la concatenación tiene prioridad sobre las barras de unión.

Topología de Patrones y Diagramas de Flujo Ferroviario

Los diagramas de flujo ferroviario ilustran de forma visual cómo los tokens de una expresión regular avanzan a través de los estados de coincidencia de izquierda a derecha:

Nodos Secuenciales de la Canalización

Los tokens se muestran como estaciones conectadas sobre una vía única. La coincidencia exige que el motor transite por cada nodo obligatorio en orden estricto de izquierda a derecha.

Insignias de Repetición de Cuantificadores

Las repeticiones (+, *) y los modificadores opcionales (?) se identifican con insignias de cardinalidad que indican los límites de repetición directamente sobre el nodo.

Ámbitos de Grupo y Límites de Cadena

Los nodos de límite de Inicio y Fin anclan la secuencia, mientras que los grupos parentéticos y las alternancias delimitan los alcances de subexpresiones a lo largo del trayecto.

Diagnóstico de Retroceso Catastrófico (ReDoS) y Mitigación Algorítmica

La Denegación de Servicio por Expresiones Regulares (ReDoS) se produce cuando un motor NFA procesa cuantificadores ambiguos anidados o adyacentes frente a caracteres terminales no coincidentes:

Patrón Patológico Vulnerable

// Complejidad exponencial: O(2^n) const redosPattern = /^([a-zA-Z0-9]+)+$/; redosPattern.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaa!");

Cuando el signo de exclamación final no coincide, el motor debe evaluar matemáticamente cada permutación para particionar 28 caracteres entre los cuantificadores + interno y externo (2^28 ≈ 268,435,456 estados), bloqueando los hilos de CPU indefinidamente.

Refactorización Lineal Determinista

// Complejidad lineal determinista: O(n) const safePattern = /^[a-zA-Z0-9]+$/; safePattern.test("aaaaaaaaaaaaaaaaaaaaaaaaaaaa!");

Eliminar el cuantificador externo redundante suprime la bifurcación ambigua. Al usar repeticiones delimitadas (p. ej. tokens separados por comas), obligue a la disyunción de clases de caracteres ([^,\n]+) para garantizar tiempo de evaluación lineal.

Aserciones de Ancho Cero Frente a Tokens Consumidores

Las aserciones de ancho cero evalúan condiciones en los límites de los caracteres sin desplazar el puntero de coincidencia de la cadena:

Tipo de AserciónSintaxisDirección de InspecciónLógica de Ejecución del Motor
Lookahead Positivo(?=...)Actual → DerechaComprueba si los caracteres inmediatamente posteriores al índice actual coinciden con el subpatrón. Tiene éxito sin avanzar el puntero de coincidencia.
Lookahead Negativo(?!...)Actual → DerechaAfirma que los caracteres que siguen inmediatamente al cursor actual no coinciden con el subpatrón. Falla de inmediato si se produce una coincidencia.
Lookbehind Positivo(?<=...)Izquierda ← ActualExamina hacia atrás desde el cursor actual para verificar que el texto precedente coincide. Motores modernos como V8 admiten longitud variable.
Lookbehind Negativo(?<!...)Izquierda ← ActualVerifica que el texto precedente no coincida con el subpatrón. Resulta especialmente útil para validar contextos de delimitadores sin escapar.

Directrices de Optimización de Rendimiento para Regex en Producción

Reglas arquitectónicas para maximizar el rendimiento de evaluación y suprimir operaciones superfluas en el motor de expresiones regulares:

Fijar Anclajes Tempranos para Fallo Rápido

Los patrones sin anclaje obligan al motor a comprobar cada índice de carácter en cargas de gran tamaño antes de confirmar el fallo. Prefijar los patrones con ^ o límites de palabra explícitos (\b) descarta cadenas no coincidentes de forma inmediata en el índice 0.

Sustituir Alternancias por Clases de Caracteres

Evaluar alternancias como (a|b|c) requiere apilar y desapilar marcos en la pila de retroceso. El uso de una clase de caracteres como [abc] compila a una búsqueda por máscara de bits en tiempo O(1) que se resuelve en un solo ciclo de CPU.

Utilizar Grupos sin Captura por Defecto

Los grupos estándar (...) generan sobrecarga en el recolector de basura al asignar porciones de subcadenas en las matrices de coincidencia. Emplee grupos sin captura (?:...) siempre que los valores no necesiten extracción posterior.

Ordenar Alternancias por Frecuencia Empírica

Los motores NFA tradicionales evalúan las ramas de alternancia en orden estricto de izquierda a derecha. Posicionar la rama estadísticamente más frecuente en primer lugar (por ejemplo, (GET|POST|PUT|DELETE) en lugar de (DELETE|PUT|POST|GET)) maximiza las salidas tempranas con éxito.

Frequently Asked Questions

¿Cómo descompone un explicador de regex en línea las expresiones regulares en lenguaje comprensible?

Un explicador de expresiones regulares opera mediante dos fases de compilación: tokenización léxica y análisis sintáctico por descenso recursivo. El analizador léxico descompone la expresión en elementos atómicos, distinguiendo caracteres literales de metacaracteres como anclas (^, $), cuantificadores (*, +, {n,m}), conjuntos ([a-z]) y delimitadores de grupo. Posteriormente, el analizador sintáctico organiza estos tokens en un Árbol de Sintaxis Abstracta (AST), traduciendo propiedades, cotas de cuantificación y niveles de anidamiento a explicaciones paso a paso sin ambigüedades.

¿Cómo se interpretan los diagramas secuenciales de flujo ferroviario (Railway Diagrams) en expresiones regulares?

Los diagramas de flujo ferroviario visualizan las expresiones regulares como una canalización de ejecución que discurre secuencialmente de izquierda a derecha, desde el Inicio hasta el Fin. Cada token se representa como una estación o nodo a lo largo de la vía, indicando su categoría sintáctica (literales, clases de caracteres, grupos o anclajes) junto con insignias de cardinalidad y cuantificación. Seguir los nodos en orden secuencial permite entender el flujo de coincidencia con mucha mayor rapidez que descifrar cadenas crudas de sintaxis.

¿Qué origina una advertencia de retroceso catastrófico (ReDoS) y cómo se soluciona?

El retroceso catastrófico se produce en motores NFA cuando cuantificadores ambiguos anidados o adyacentes (como (a+)+ o ([a-z]+)*) procesan texto que coincide con el prefijo pero falla en un ancla final. El motor evalúa matemáticamente cada combinación posible de partición de la cadena entre los cuantificadores, provocando un retroceso exponencial O(2^n) que agota la CPU. Para corregirlo, elimine cuantificadores redundantes, diseñe clases de caracteres mutuamente disjuntas (por ejemplo, reemplazando .* por [^,\n]+) o aplique técnicas de agrupación atómica.

¿Cuál es la diferencia entre los grupos de captura (...) y los grupos sin captura (?:...)?

Los grupos de captura ((...)) aíslan subpatrones y reservan bloques de memoria indexados para almacenar los fragmentos de subcadena coincidentes ($1..$9 o match[1]), lo que añade sobrecarga al recolector de basura. Los grupos sin captura ((?:...)) aplican precedencia de operadores y agrupan tokens lógicamente sin reservar ranuras de captura ni almacenar subcadenas. En patrones de producción donde no se requiere extraer variables, los grupos sin captura optimizan el rendimiento.

¿Cómo funcionan las aserciones de ancho cero lookahead (?=...) y lookbehind (?<=...)?

Las aserciones de contexto (lookaround) son condiciones de ancho cero: comprueban si el texto adyacente cumple un subpatrón sin desplazar el cursor de coincidencia ni incluir los caracteres evaluados en la coincidencia resultante ($&). Las aserciones hacia adelante (?=...) y (?!...) inspeccionan el texto que sigue inmediatamente al cursor, mientras que las aserciones hacia atrás (?<=...) y (?<!...) verifican el texto precedente. Se emplean habitualmente para validar múltiples criterios simultáneos (como complejidad de contraseñas) en la misma posición.

¿Cuál es la diferencia entre cuantificadores codiciosos (*, +) y perezosos (*?, +?)?

Los cuantificadores estándar (*, +, {n,m}) son codiciosos (greedy): consumen tantos caracteres coincidentes como sea posible desde el principio y retroceden carácter a carácter solo cuando los tokens posteriores no coinciden. Añadir un signo de interrogación los convierte en perezosos (*?, +?, {n,m}?): consumen la cantidad mínima indispensable de caracteres para cumplir la condición y solo se expanden si los tokens posteriores fallan. Por ejemplo, <.*> coincide desde el primer < hasta el último > de una línea, mientras que <.*?> se detiene en el primer > de cierre.

¿Por qué una expresión regular explicada aquí puede fallar o actuar diferente en Go (RE2) o Python?

Distintos entornos de ejecución emplean diferentes arquitecturas de motor regex. JavaScript (V8), Python y PCRE utilizan motores NFA tradicionales que admiten características avanzadas como aserciones lookaround y referencias inversas. En cambio, la biblioteca estándar de Go (paquete regexp) utiliza Google RE2, un motor basado en DFA que garantiza tiempo de ejecución lineal O(n) al prohibir de forma explícita aserciones lookaround y referencias inversas. Al migrar expresiones de NFA a DFA, las aserciones deben reescribirse como tokens de delimitación explícitos.

¿Por qué se recomienda utilizar grupos de captura con nombre (?<nombre>...) en lugar de índices numéricos?

Los grupos de captura con nombre ((?<nombre>...)) almacenan las subcadenas extraídas en un objeto de diccionario con clave semántica (como match.groups.nombre) en lugar de depender de posiciones numéricas ($1, $2). En sistemas de producción, modificar, añadir o reordenar grupos dentro de un patrón complejo altera los índices numéricos en todo el código base, provocando errores silenciosos. Los grupos con nombre garantizan que la lógica de extracción permanezca desacoplada de cambios estructurales en el patrón.