Normalmente en nuestro trabajo utilizamos expresiones regulares en captura o coincide con operaciones.Expresiones regulares generativas
Sin embargo, las expresiones regulares se pueden utilizar, al menos manualmente, para generar sentencias legales que coincidan con la expresión regular. Por supuesto, algunas expresiones regulares pueden coincidir con oraciones infinitamente largas, por ejemplo, la expresión .+
.
Tengo un problema que podría resolverse mediante el uso de un algoritmo de generación de oraciones de expresión regular.
En pseudocódigo, que operaría algo como esto:
re = generate("foo(bar|baz)?", max_match = 100); #Don't give me more than 100 results
assert re == ("foobar", "foobaz", "foo");
Qué algoritmo llevaría a cabo esto por mí?
Sé cómo hacer esto fácilmente con una cadena de búsqueda dada y un patrón determinado. ¿Es eso lo suficientemente bueno? Si es así, dímelo y te mostraré. Eres muy inteligente para darle un límite superior, también. Yo puedo hacer eso. Pero hay infinitas cadenas de lo contrario, así que no sé cómo lo harías, aunque tal vez se aplique la "prueba de fuzz" de Bart Miller, en la que genera entradas aleatorias para alimentar programas para ver si eso hace que fallen espectacularmente. – tchrist
@tchrist: Puedo generar basura al azar bastante bien. Me gustaría hacer algo como lo muestra el ejemplo anterior. Mi rummaging muestra que el módulo de Perl String :: Random es muy parecido a Xeger, pero no admite (|). Xeger solo anda por el autómata que describe la expresión regular. Ese parece ser un caso común. Leí que Haskell tiene un módulo de expresiones regulares que genera, estoy cavando en ese cajero automático. –
No se pudo encontrar el módulo de expresiones regulares de haskell. : -/ –