2010-07-26 30 views
5

¿Alguien sabe dónde puedo obtener una expresión regular que coincida con cualquier expresión regular válida de estilo C#? ¿Es posible?Regex que coincida con cualquier expresión regular válida

FYI, la razón por la que estoy tratando de hacer esto es porque tengo un mini lenguaje que permite expresiones regulares como parte de su sintaxis y preparé expresiones criptográficas para validar las declaraciones de mini-lenguaje pero falla incorrectamente en algunas expresiones más complicadas. La sintaxis de mini-lenguaje se define mediante una combinación de expresiones eBNF y regulares. Podría hacer esta 'validación' en C#, pero creo que si este enfoque es posible, sería la separación más limpia y mejor de las preocupaciones.

Gracias, Brian

+0

¿Debería la expresión regular escrita en el sabor .NET ...? – kennytm

Respuesta

10

No, no se puede. Al menos no en general. Las expresiones regulares describen los idiomas regulares y se caracterizan por el hecho de que no pueden contener expresiones anidadas arbitrariamente. Así que algo así como

(ab(?:cd)e(fg)) 

ya es prácticamente imposible de validar solo con expresiones regulares. Si bien ciertos sabores de expresiones regulares permiten el descenso recursivo en el partido (Perl, por ejemplo) o grupos de captura equilibrados que pueden emular esto hasta cierto punto, definitivamente es no la herramienta diseñada para este trabajo y no deberías tratar de calzarlo en uno.

Lo que puede hacer es simplemente tratar de compilar una expresión que desea validar. El motor de expresiones regulares de .NET lanzará una excepción si el patrón no es válido:

var compiledRegex = new Regex(someString); 
+0

Esto es lo que tenía miedo, pero si es la única opción, entonces supongo que tengo que lidiar con eso. Gracias por la aclaración/explicación. –

+0

Usar excepciones para controlar el flujo de la aplicación no es la mejor práctica, pero escribir un validador para expresiones regulares no es trivial. –

+0

Bueno usando la línea "nueva Regex (someString);" esencialmente validará la expresión regular. La cadena que se valida es técnicamente ingresada por el usuario, por lo que atrapar una excepción en la entrada de un usuario incorrecto es probablemente la forma más razonable de lidiar con esto. ¿Derecha? –

Cuestiones relacionadas