El verdadero alcance de las expresiones regulares modernas

Fuentes: The true power of regular expressions

Las expresiones regulares han adquirido desde hace tiempo una fama inmerecida en los foros de programación: la idea de que no sirven para nada que vaya más allá de las gramáticas regulares se repite a diario, aunque es esencialmente incorrecta. Este artículo desmonta ese mito desde la base formal y demuestra hasta dónde llegan los motores actuales.

En lingüística formal, una gramática es "regular" cuando todas sus reglas de producción adoptan una de tres formas muy concretas (B → a, B → aC o B → ε). Los números naturales, por ejemplo, admiten una gramática regular, que puede abreviarse con la expresión /[0-9]+/. Sin embargo, las implementaciones que utilizan los programadores —como PCRE, el motor usado en PHP— difieren notablemente de la noción teórica original.

La clave está en la jerarquía de Chomsky, que ordena los lenguajes formales en cuatro niveles: regulares (Tipo 3), libres de contexto (Tipo 2), sensibles al contexto (Tipo 1) y recursivamente enumerables (Tipo 0). Las regex modernas, gracias a mecanismos como las subpatrones recursivos (?1), pueden reconocer lenguajes libres de contexto como {aⁿbⁿ}, con la expresión /^(a(?1)?b)$/, algo formalmente imposible para una gramática regular pura.

El texto subraya que esta potencia basta para describir la sintaxis de la práctica totalidad de lenguajes de programación, cuyas gramáticas son libres de contexto. Así, expresiones como /^(a(?1)?b)$/, /^(a(a(?1)?b)?b)$/ o /^(a(a(a(?1)?b)?b)?b)$/ muestran cómo un motor recursivo moderno puede igualar y superar lo que la teoría clásica adjudicaba a las regex.