Como su nombre lo sugiere, podemos pensar que las expresiones regulares solo pueden coincidir con los idiomas normales. Pero las expresiones regulares que usamos en la práctica contienen cosas que no estoy seguro de que sea posible implementar con sus homólogos teóricos. ¿Cómo, por ejemplo, simularías una retrospectiva? Entonces surge la pregunta: ¿cuál es el poder teórico de las expresiones regulares que usamos en la práctica? ¿Puedes pensar en una forma de hacer coincidir {(a^n)(b^n)|n>=0}
? ¿Qué hay de {(a^n)(b^n)(c^n)|n>=0}
?¿Cuál es el poder de las expresiones regulares?
Respuesta
La respuesta a su pregunta es que los lenguajes de "expresiones regulares" que permiten referencias no son ni regulares ni contextuales. (En otras palabras, como señaló, no puede simular referencias con un lenguaje regular, ni con una CFL). De hecho, Wikipedia dice que muchos de los lenguajes de "expresión regular" que usamos en la práctica son NP-Complete:
coincidencia de patrones con una ilimitada número de referencias de la espalda, como apoyado por numerosas herramientas modernas, es NP-completo (véase,
[11]
Teorema 6.2).
Como otros han sugerido, los lenguajes de expresiones regulares comúnmente admitidos en lenguajes de programación y bibliotecas son un animal diferente de las expresiones regulares en la teoría del lenguaje formal. Larry Wall wrote en lo que respecta a Perl expresiones regulares ""
'' Las expresiones regulares [...] sólo son marginalmente relacionadas con los bienes expresiones regulares. Sin embargo, el término ha crecido con las capacidades de nuestros motores de combinación de patrones , así que no estoy tratando de luchar contra la necesidad lingüística aquí.Yo, sin embargo, general, los llaman "expresiones regulares"
Usted preguntó,
¿Se puede pensar en una forma para que coincida con {(a^n) (b^n) | n> = 0}? ¿Qué pasa con {(a^n) (b^n) (c^n) | n> = 0}?
No estoy seguro de que aquí si usted está tratando de probar si teóricos lenguajes de expresiones regulares pueden coincidir con el "lenguaje de los cuadrados", o si usted está buscando una implementación en un (práctica) regex idioma. Here's the proof why the former is not possible; y here's a long explanation and implementation of the latter para expresiones regulares de Java.
La dificultad básica con las expresiones regulares que está insinuando es el hecho de que las expresiones regulares no tienen una "memoria" para ellas. En la forma más pura, ninguna expresión regular real debería ser capaz de reconocer ninguno de estos lenguajes. Cualquier expresión regular que pueda analizar estos tipos de idiomas sería, por definición, no regular. Creo que lo que quiere decir con "expresiones regulares que usamos es practicar" es extendidas expresiones regulares, que no son expresiones técnicamente regulares.
El problema con su pregunta es que está solicitando aplicar un escenario teórico específicamente inventado a una situación práctica, que casi siempre termina en un desastre.
Así que mi respuesta es una especie de falta de respuesta, en el sentido de que debo reformular la pregunta para preguntar acerca de las expresiones regulares extendidas para que tenga una respuesta.
Un par de recursos que podrían ayudar en este asunto:
Similar StackOverflow question
Good book with a chapter on this topic
También estoy haciendo mi respuesta un wiki de la comunidad para cualquier otra persona que quiera contribuir a esta línea de pensamiento.
- 1. El poder de reconocimiento de las expresiones regulares "modernas"
- 2. delimitador de expresiones regulares de PHP, ¿cuál es el punto?
- 3. nulabilidad (Las expresiones regulares)
- 4. ¿Cuál es el efecto de "*" en expresiones regulares?
- 5. ¿Por qué las expresiones regulares se llaman expresiones "regulares"?
- 6. ¿Es posible tener expresiones regulares que coincidan con todas las expresiones regulares válidas?
- 7. ¿Debo evitar las expresiones regulares?
- 8. ¿Cómo dominar las expresiones regulares?
- 9. Agrupación en las expresiones regulares de haskell
- 10. búsqueda de Ruby matrices con expresiones regulares Las expresiones
- 11. Compilador de expresiones regulares
- 12. Expresiones regulares en J2ME
- 13. Las expresiones regulares búsqueda negativa hacia delante
- 14. expresiones regulares Las expresiones para todos los símbolos no alfanuméricos
- 15. Limitaciones de expresiones regulares?
- 16. Las expresiones regulares en C preprocesador macro
- 17. de expresiones regulares negativo
- 18. ¿Se detienen todas las expresiones regulares?
- 19. ¿Cuál es el número máximo de capturas de expresiones regulares numeradas?
- 20. ¿Composición de expresiones regulares?
- 21. ¿Cómo detecta JavaScript las expresiones regulares?
- 22. expresiones regulares en Javascript con jQuery Contiene expresiones regulares extensión
- 23. ¿Cómo puedo perfilar las expresiones regulares de Perl?
- 24. Las expresiones regulares: extraer todas las palabras de cotizaciones
- 25. Partido hasta x expresiones regulares o y expresiones regulares
- 26. Expresiones regulares mutuamente excluyentes
- 27. expresiones regulares (expresiones regulares), reemplace la segunda aparición en javascript
- 28. Uso de expresiones regulares en JSP EL
- 29. expresiones regulares para el contenido entre e incluyendo las parenthees
- 30. ¿es posible usar expresiones regulares en C++?
Necesita definir aún más "expresiones regulares que usamos en la práctica". Diferentes motores regex varían en potencia. – sepp2k
Existen expresiones que coinciden con sus ejemplos para el motor .NET Regex utilizando grupos de captura equilibrados. '"^(a (? )) * (b (?)) * (? (a) (?!)) $ "' para la primera, p. –
Jens
Esto parece más como una pregunta para los teóricos computacionales que para un sitio de programación. –