with sharp regular regex parsing random reverse

regex - sharp - ¿Cómo generar cadenas aleatorias que coincidan con una expresión regular determinada?



replace any letter regex (5)

Analice su expresión regular en un DFA , luego recorra su DFA aleatoriamente hasta que termine en un estado de aceptación, generando un personaje para cada transición. Cada caminata producirá una nueva cadena que coincida con la expresión.

Sin embargo, esto no funciona para expresiones "regulares" que no son realmente regulares, como expresiones con referencias hacia atrás. Depende del tipo de expresión que buscas.

Duplicar:

Cadena aleatoria que coincide con una expresión regular

No, no lo es. Estoy buscando un método fácil y universal, uno que realmente pueda implementar. Eso es mucho más difícil que generar contraseñas al azar.

Quiero crear una aplicación que tome una expresión regular y muestre 10 cadenas generadas aleatoriamente que coincidan con esa expresión. Se supone que debe ayudar a las personas a comprender mejor sus expresiones regulares y a decidir, por ejemplo, si son lo suficientemente seguras como para validarlas. ¿Alguien sabe de una manera fácil de hacer eso?

Una solución obvia sería escribir (o robar) un analizador de expresiones regulares, pero eso realmente parece estar por encima de mi cabeza.

Repito, estoy buscando una manera fácil y universal de hacer eso.

Editar: El enfoque de la fuerza bruta está fuera de discusión. Suponiendo que las cadenas aleatorias serían simplemente [a-z0-9]{10} y 1 millón de iteraciones por segundo, llevaría 65 años iterar a través del espacio de todas las cadenas de 10 caracteres.



Una solución bastante fea que puede o no ser práctica es aprovechar una opción existente de diagnóstico de expresiones regulares. Algunas bibliotecas de expresiones regulares tienen la capacidad de descubrir dónde falló la expresión regular. En este caso, podría usar lo que en realidad es una forma de fuerza bruta, pero usar un personaje a la vez y tratar de obtener cadenas más largas (y de mayor coincidencia) hasta que obtenga una coincidencia completa. Esta es una solución muy fea. Sin embargo, a diferencia de una solución de fuerza bruta estándar, la falla en una cuerda como ab también le dirá si existe una cadena ab. * Que coincidirá (si no, deténgase y pruebe ac. Si es así, intente con una cuerda más larga). Esto probablemente no sea factible con todas las bibliotecas de expresiones regulares.

Por el lado positivo, este tipo de solución es probablemente muy buena desde el punto de vista de la enseñanza. En la práctica, es probablemente similar en efecto a una solución dfa, pero sin el requisito de pensar en dfas.

Tenga en cuenta que no querrá usar cadenas aleatorias con esta técnica. Sin embargo, puede usar caracteres aleatorios para comenzar si realiza un seguimiento de lo que ha probado en un árbol, por lo que el efecto es el mismo.


si su único criterio es que su método es fácil y universal, entonces no hay nada más fácil o más universal que la fuerza bruta. :)

for (i = 0; i < 10; ++i) { do { var str = generateRandomString(); } while (!myRegex.match(str)); myListOfGoodStrings.push(str); }

Por supuesto, esta es una forma muy tonta de hacer las cosas y, en su mayor parte, fue una broma.

Creo que tu mejor opción sería intentar escribir tu propio analizador sintáctico básico, enseñándole solo las cosas que esperas encontrar (por ejemplo, rangos de letras y números, caracteres repetitivos / opcionales ... no te preocupes por mirar) detrás, etc.)


El criterio de universalidad es imposible. Dada la expresión regular "^ Para ser, o no ser, esa es la pregunta: $" , no habrá diez cadenas aleatorias únicas que coincidan.

Para casos no degenerados:

El enlace de moonshadow a Perl''s String :: Random es la respuesta. Un programa de Perl que lee un RegEx de stdin y escribe el resultado de diez invocaciones de String :: Random a stdout es trivial. Compílalo con un exe de Windows o Unix con Perl2exe e invocalo desde PHP, Python o lo que sea.

También vea el generador de texto aleatorio basado en expresiones regulares