2010-05-25 345 views
11

En uno de los podcasts de StackOverflow (en el que los muchachos discutían la generación de datos para probar DB, #11 o #12), Jeff mencionó algo así como "expresiones regulares inversas", que se usan exactamente para ese propósito: dada una expresión regular, produce una cadena que eventualmente coincidirá con dicha expresión regular.Revertir expresiones regulares para generar datos

¿Cuál es el término correcto para todo este concepto? ¿Es este un concepto bien conocido?

+3

Más sobre esto: http://stackoverflow.com/questions/205411/random-string-that-matches-a-regexp – miku

+0

http://www.texamples.com/how-to-generate-random-passwords -in-java/esto podría ayudarte. – brainless

Respuesta

0

No existe la "expresión regular inversa". Una expresión regular es solo eso: una expresión. Expresa un lenguaje , que consiste en un conjunto de cadenas (posiblemente infinito).

La anulación está en el use de la expresión: donde se usa comúnmente para informar si una cadena está en el idioma, ahora se usa para producir cadenas en el idioma.

4

Resumen: Recursive transition network (con la postmodernism generator como un ejemplo interesante)

Una especialización será su "expresión regular inversa".


En cuanto a la terminología: A expresión regular es una forma de gramática que describe todas las palabras perteneciente a un lenguaje regular específica (es decir, todas las entradas emparejado por la expresión)

Por lo tanto se podría llamar a su pregunta: "¿Cómo se puede crear una palabra al azar que coincide con una expresión regular dada" o "¿Cómo puedo obtener una palabra al azar que pertenece a un lenguaje regular especificada".

+0

Una gramática libre de contexto (CFG) no es regular, como puede demostrarse usando el lema de bombeo. Sin embargo, la idea de una RTN aún se puede aplicar, usando un autómata de estado finito no determinista (NFA) en su lugar. – Thomas

+1

@Thomas: Sí, pero uno normal no tiene contexto, por lo que se puede aplicar el mismo concepto (no es más que una especialización). – Dario

+0

Ah, obviamente, tienes razón. – Thomas

5

El módulo Perl String::Random (en el CPAN) hace esto. Toma un subconjunto de expresiones regulares, y hace un recorrido aleatorio a través de él.

+0

Will String :: Random genera necesariamente todos los valores posibles en el conjunto de soluciones? Tengo un problema similar, pero necesito todos los valores posibles. Estoy dispuesto a restringir fuertemente mi idioma. – IceArdor

0

Es absolutamente posible generar datos a partir de expresiones regulares. Algunos proyectos de código abierto están en desarrollo en esta área.

Un tutorial sobre how to generate random password from regex le explicará cómo se hace. xeger (reverso de regex, un proyecto de código abierto) se utiliza en el tutorial. Por favor, repase el tutorial para obtener más información.