Recientemente hablé con un amigo sobre un sitio web que propuso desafíos de expresiones regulares, principalmente haciendo coincidir un grupo de palabras con una propiedad especial. Estaba buscando una expresión regular que coincida con cadenas como ||||||||
donde el número |
es primo. Inmediatamente le dije que eso nunca funcionaría porque si ese lenguaje fuera regular, la traducción del lema de bombeo daría el hecho de que, por un momento lo suficientemente grande, existe tal que es primo para todos y bueno, este no es el caso (reparto de primos, trivialidad de una propiedad tan desconocida y aplastante, ...)
Pero entonces alguien llegó con la solución: QUE NO (||+?)\1+
Esta expresión intenta hacer coincidir el grupo de captura (que puede ser ||
, |||
, ||||
y así sucesivamente deocurrencias de |
)veces. Si coincide, significa que el número representado por la cadena es divisible por, y por lo tanto no es primo. De lo contrario, lo es.
Y me sentí estúpido, porque se hizo evidente que la agrupación y la referencia inversa permiten que la expresión regular sea en realidad mucho más expresiva que ... la expresión regular, en el sentido teórico. Ahora incluso agregaron búsquedas y otros operadores que no conocía cuando solía hacer expresiones regulares reales.
Según Wikipedia, es aún más expresivo que los lenguajes generados por una gramática libre de contexto. Ésta es mi pregunta :
- ¿Podemos representar cualquier lenguaje algebraico (generado a partir de una gramática libre de contexto) con motores modernos de expresión regular
- ¿Hay una descripción más general, o al menos un límite superior sobre la complejidad de qué tipo de lenguajes puede describir una expresión regular moderna?
Más pragmáticamente, ¿hay alguna teoría seria detrás de esto o simplemente estamos agregando nuevas características cada vez que parece implementable en el bloque inicial de expresiones regulares reales basadas en autómatas finitos?
Sé que "regex moderno" no es muy específico mientras que la pregunta es, pero quiero decir al menos con referencias inversas, y posiblemente más. Por supuesto, si tiene respuestas parciales asumiendo ciertas restricciones en este lenguaje "regex moderno", no dude en publicarlo.
fuente
Respuestas:
El problema de las expresiones regulares con referencias inversas es NP-complete; citando a Aho (1990) a través de Blaisorblade / Charles Stewart .
No conozco todo el conjunto de operadores que tienen algunos sabores de expresiones regulares, pero varios no son más poderosos que los normales ; probablemente se han agregado como azúcar sintáctico.
fuente