2010-05-25 29 views
6

¿Es posible detectar si una cadena dada es una expresión regular válida, solo con expresiones regulares?¿Es posible tener expresiones regulares que coincidan con todas las expresiones regulares válidas?

Digamos que tengo algunas cadenas, que pueden ser expresiones regulares válidas o no. Me gustaría tener una expresión regular que coincida con la cadena que corresponde a la expresión regular válida. ¿Es eso posible? ¿O tengo que utilizar alguna gramática de nivel superior (es decir, un lenguaje sin contexto) para detectar esto? ¿Afecta si uso alguna versión extendida de expresiones regulares como Perl regexps?

Si eso es posible, ¿cuál es la expresión regular que coincide con la expresión regular?

+0

posible duplicado de [¿Existe una expresión regular para detectar una expresión regular válida?] (http://stackoverflow.com/questions/172303/is-there-a-regular-expression-to-detect-a-valid-regular-expression) – outis

Respuesta

8

No, no es posible. Esto se debe a que las expresiones regulares válidas implican agrupar, lo que requiere paréntesis equilibrados.

Los delimitadores equilibrados no pueden coincidir con una expresión regular; en su lugar, deben coincidir con un context-free grammar. (El first example sobre ese artículo se ocupa de paréntesis equilibrados.)

+0

Ok, eso es cierto con las expresiones regulares normales ¿Qué tal algo así como Perl regex? –

+0

@Juha Syrjälä: En realidad, estaba pensando en expresiones referenciales de Perl específicamente. Los paréntesis de agrupación no se pueden combinar con una expresión regular, como he explicado. –

+0

PCRE y .NET extienden expresiones regulares para que también coincidan con el equilibrio subgrupos. Perl 6 expande expresiones regulares con reglas que también lo habilitan. Pero ahora la descripción "expresión regular" ya no es precisa. De hecho, la mayor parte de lo que hoy se entiende por "expresión regular" ya no es regular. –

0

Si su pregunta ha sido "coincida con todas las expresiones regulares válidas", la respuesta es (tal vez sorprendentemente) 'sí'. La expresión regular .* coincide con todas las expresiones regulares válidas (y no válidas), pero es bastante inútil para determinar si está buscando una válida.

Sin embargo, como la pregunta es "que coincida con todos y solamente las expresiones regulares válidos", la respuesta es (como DVK y Platino Azure" haber dicho 'no'.

Cuestiones relacionadas