Las expresiones regulares no son


36

Pregúntele incluso a alguien con experiencia en informática qué es una expresión regular, y es probable que la respuesta vaya más allá de la restricción de estar al alcance de un autómata de estado finito.

Por ejemplo, la "expresión regular"

/^1?$|^(11+?)\1+$/

creado por la destacada personalidad de Perl, Abigail (y parte del conjunto de pruebas de Perl desde 2002) describe una máquina que acepta solo números unarios compuestos, pero el ejercicio 4.5 (b) en la tercera edición de Peter Linz An Introduction to Formal Languages ​​and Automata hace que el lector use el lema de bombeo para demostrar que

L={an:n is not a prime number}

No es un lenguaje normal.

En contextos donde la distinción es importante, ¿cómo deberíamos llamar a las expresiones estrictamente más poderosas?

Respuestas:


46

Larry Wall propuso que usemos "expresión regular" para el formalismo que Kleene propuso, y "expresión regular" para expresiones para las extensiones ampliamente utilizadas. Es una convención bastante ampliamente seguida. Si desea dejar en claro que está hablando de expresiones regulares en el sentido de los idiomas formales, por lo general no es difícil traducirlo al lenguaje hablado.

El poder de las expresiones regulares proviene del retroceso, y se ha trabajado en autómatas para idiomas regulares con retroceso. Véase, en particular, Becchi & Crowley, 2008, Extendiendo autómatas finitos para que coincida de manera eficiente con las expresiones regulares compatibles con Perl .


55
Estoy de acuerdo, algo así como "Perl regex" ("POSIX regex", etc.) vs. "lenguaje normal" debería ser lo suficientemente claro como para evitar cualquier posibilidad de mala interpretación.
Jukka Suomela

Las expresiones regulares de Perl tienen muchas más características adicionales que solo retroceder.
reinierpost

@reinierpost Es cierto, pero creo que el retroceso es el más importante desde una perspectiva de idiomas formales. Las expresiones regulares de Perl tienen características como la ejecución de código arbitrario de Perl, pero creo que las expresiones regulares deberían interpretarse libremente como que cubren PCRE. Los PCRE contienen rarezas como patrones recursivos, pero estas son artes oscuras, que lo llevan lejos del ámbito de los lenguajes regulares. Sin embargo, podría actualizar mi respuesta para cubrir estos.
Charles Stewart el

18

Estas expresiones han sido examinadas por Aho (Handbook of Theoretical Computer Science, Vol. A, Cap. 5) y Campeanu, Salomaa, Yu ("Un estudio formal de expresiones prácticas prácticas", International Journal of Foundations of Computer Science, 14: 1007 –1018, 2003), así como algunos de los documentos de seguimiento.

Aho llama a las expresiones más poderosas "rewbr" (expresión regular con referencias posteriores), Campeanu et al. use "expresión regular extendida" así como "expresión regular práctica". Como parece, "expresión regular extendida" es el término más utilizado en la literatura reciente.

Partiendo del término "expresión racional" de la escuela francesa, y considerando el hecho de que esas expresiones se usan en el mundo real, a mí me gusta "expresión real".

Anexo: Un capítulo en mi tesis doctoral trata sobre esta clase de lenguajes formales (el documento correspondiente aparecerá en STACS 2011). Mientras escribía ese capítulo y el artículo, experimenté con varios términos. Finalmente, decidí usar expresiones regulares extendidas para el modelo con referencias posteriores y expresiones regulares adecuadas para las expresiones regulares agradables y normales. Como es bastante molesto cambiar la terminología en un documento que ya está completamente (o en su mayoría) escrito, creo que algunos podrían estar interesados ​​en las experiencias que llevaron a mi elección:

Primero, regex y rewbr realmente no ruedan la lengua, y usarlas una y otra vez en el transcurso de un trabajo completo se volvió realmente pesado para escribir y leer, en particular cuando se usa cualquiera de las posibles formas plurales. Las expresiones regulares similares a PERL también eran bastante difíciles de manejar. Por supuesto, no soy hablante nativo, así que YMMV.

Segundo, tan pronto como uno quiera hablar sobre ambos modelos, es conveniente usar términos que sean una variación de la expresión regular , ya que esto permite enfatizar la similitud o las diferencias según sea necesario (por ejemplo, "una expresión regular, sea apropiada o extendido"). Además, esto permite enfatizar fácilmente el caso especial de "expresiones regulares extendidas sin referencias posteriores", cuando se habla de casos especiales en toda la clase, en lugar de comparar diferentes modelos.

Tercero, preferí usar un término que ya se usa en la literatura sobre un término recién acuñado, lo que me permitió elegir entre expresiones regulares extendidas y expresiones regulares prácticas . La segunda opción implicaba (al menos implícitamente) que las expresiones regulares adecuadas son poco prácticas, lo que se siente bastante extraño (especialmente porque el RE2 de Google no usa backrefs y parece ser bastante práctico).

Por supuesto, esta opción es solo mi "máximo local personal", y dependiendo de las necesidades, otras opciones podrían ser más apropiadas.


77
Desafortunadamente, el término expresión regular extendida ya lo toma POSIX, que distingue entre expresión regular básica (BRE) y expresión regular extendida (ERE) , las cuales son expresiones regulares extendidas de acuerdo con su definición.
Jörg W Mittag

@ Jörg: En realidad, según esto, ni las expresiones regulares POSIX extendidas ni las básicas son más potentes que las expresiones regulares regulares. Y BRE puro (no GNU) parece ser en realidad menos poderoso que las expresiones regulares (falta un operador de alternancia).
sepp2k

Consulte "Sobre expresiones regulares extendidas" de Carle y Narendran (2009) para obtener resultados más recientes sobre este "rewbr": portal.acm.org/citation.cfm?id=1533235
Jakob

Otros resultados recientes sobre esta clase de idioma: "Sobre la intersección de los idiomas de expresiones regulares con los idiomas regulares" por Campeanu y Santean (TCS 410, 2009) "Una prueba de coincidencia de tiempo polinómica para grandes clases de expresiones regulares extendidas" por Reidenbach y Schmid (CIAA 2010 ) y "Expresiones regulares extendidas: brevedad y capacidad de decisión" (por mí, que aparecerá en STACS 2011).
Dominik D. Freydenberger 01 de

6

Se sabe que el llamado regexp de Perl es lo suficientemente poderoso como para ser Turing completo; Incluso hay un compilador del programa habitual para perl regexp.

Por lo tanto, dudo que tenga sentido buscar un nombre para este tipo de "expresiones regulares".

Busque por ejemplo en http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm


¿Tienes algunos consejos?
András Salamon

55
@ András: Creo que Arthur está hablando de la ?{CODE}directiva de Perl , que permite que las expresiones de patrón intercalen el código del programa en expresiones regulares. Entiendo que los PCRE se definen usualmente como la parte "declarativa" del lenguaje, y todo el lenguaje se llama lenguaje de patrones. Según WP, Aho, 1990, "Algoritmos para encontrar patrones en cadenas" muestra que el problema de la membresía para los idiomas regulares con retroceso es NP completo. No hay otras características difíciles para PCRE declarativos.
Charles Stewart el

Agregué el enlace; No miré el código fuente, así que realmente no sé cómo funciona y si hay alguna prueba de que la compilación es realmente correcta.
Arthur MILCHIOR

1
Lo sentimos, pero de acuerdo con su argumento, dado que el cálculo lambda es Turing completo, no tenía sentido buscar un nombre. Lo mismo para todos los demás formalismos y lenguajes de computación completos de Turing. Más concretamente, la integridad de Turing no describe cuán expresivo es un idioma, por lo que no tiene sentido identificar idiomas solo porque son completos de Turing. Mi ejemplo sobre el cálculo lambda fue extremo, por supuesto.
Blaisorblade

2

Creo que el mejor término para "expresión regular en el contexto de autómatas" es "expresión racional", como se usa, por ejemplo, en los Elementos de la teoría de autómatas de Sakarovitch, o en el Manual de autómatas ponderados.


1
No muy comúnmente utilizado, en mi humilde opinión.
Blaisorblade

Es / es / ampliamente utilizado en la teoría de autómatas ponderados, ver en.wikipedia.org/wiki/Rational_language . También lo he visto muchas veces en el campo de los idiomas sobre los grupos.
Michaël Cadilhac

1

Dadas las otras respuestas, sugeriría que los "idiomas regulares" son seguros, y después de comentar brevemente la diferencia, hablar sobre "expresiones regulares prácticas" para expresiones regulares (con retroceso).

También tenga en cuenta que la misma expresión regular, como expresiones regulares y como práctica, puede tener una semántica diferente, porque en este último caso la semántica se define en términos de retroceso, con diferentes resultados. Los detalles estarían fuera de tema, pero responderé si hace otra pregunta sobre eso (tal vez sobre SO en lugar de aquí, no sé) y me notificará a través de un comentario.


0

Podríamos llamarlos expresiones de patrones . Esto podría introducir confusiones con lenguajes de patrones, pero al menos estos son menos comunes.


2
En principio, estoy de acuerdo con su razonamiento, pero Campeanu, Santean y Yu ya han usado el término expresiones de patrón para denotar una clase similar de idiomas con una definición "más limpia" (ver "Expresiones de patrones y autómatas de patrones", IPL 92 (2004 )
Dominik D. Freydenberger 01 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.