Estoy escribiendo una utilidad de Java que me ayuda a generar una gran cantidad de datos para las pruebas de rendimiento. Sería realmente genial poder especificar una expresión regular para Strings para que mi generador escupe cosas que coincidan con esto. ¿Hay algo ya horneado que pueda usar para hacer esto? ¿O hay una biblioteca que me lleva la mayor parte del camino?
Gracias
Respuestas:
Editar: como se menciona en los comentarios, hay una biblioteca disponible en Google Code para lograr esto: https://code.google.com/archive/p/xeger/
Consulte también https://github.com/mifmif/Generex como lo sugiere Mifmif
Mensaje original:
En primer lugar, con una expresión regular lo suficientemente compleja, creo que esto puede ser imposible. Pero debería poder armar algo para expresiones regulares simples.
Si echas un vistazo al código fuente de la clase java.util.regex.Pattern, verás que usa una representación interna de instancias de Node. Cada uno de los diferentes componentes del patrón tiene su propia implementación de una subclase de Nodo. Estos nodos están organizados en un árbol.
Al producir un visitante que atraviese este árbol, debería poder llamar a un método generador sobrecargado o algún tipo de constructor que improvise algo.
fuente
[\w]
. Una mirada a la última línea de su wiki nos dice eso.dk.brics.automaton
así que esté preparado para agregar dependencias pom de terceros. A la mayoría de la gente no le importa eso, pero me gustaría que hubiera algo un poco más compacto.Es demasiado tarde para ayudar al póster original, pero podría ayudar a un recién llegado. Generex es una biblioteca Java útil que proporciona muchas características para usar expresiones regulares para generar cadenas (generación aleatoria, generación de una cadena basada en su índice, generación de todas las cadenas ...).
Ejemplo:
Divulgar
El proyecto mencionado en esta publicación pertenece al usuario que responde (Mifmif) la pregunta. De acuerdo con las reglas , esto debe plantearse.
fuente
Xeger (Java) también es capaz de hacerlo:
fuente
He ido a la raíz de rodar mi propia biblioteca para eso (en c # pero debería ser fácil de entender para un desarrollador de Java).
Rxrdg comenzó como una solución a un problema de creación de datos de prueba para un proyecto de la vida real. La idea básica es aprovechar los patrones de validación existentes (expresión regular) para crear datos aleatorios que se ajusten a dichos patrones. De esta forma se crean datos aleatorios válidos.
No es tan difícil escribir un analizador para patrones simples de expresiones regulares. Usar un árbol de sintaxis abstracto para generar cadenas debería ser aún más fácil.
fuente
En el podcast 11 de stackoverflow:
Probablemente esto no sea lo que está buscando, pero podría ser un buen punto de partida, en lugar de crear el suyo propio.
Parece que no puedo encontrar nada en Google, por lo que sugeriría abordar el problema analizando una expresión regular determinada en las unidades más pequeñas de trabajo (\ w, [xx], \ d, etc.) y escribiendo algunos métodos básicos para respaldar esas frases de expresión regular.
Entonces, para \ w tendría un método getRandomLetter () que devuelve cualquier letra aleatoria, y también tendría getRandomLetter (char startLetter, char endLetter) que le da una letra aleatoria entre los dos valores.
fuente
Esta pregunta es muy antigua, aunque el problema era real para mí. He intentado xeger y Generex y que no parece satisfacer mis reguirements. En realidad, fallan al procesar algunos de los patrones de expresiones regulares (como
a{60000}
) o para otros (por ejemplo(A|B|C|D|E|F)
) simplemente no producen todos los valores posibles. Como no encontré ninguna otra solución adecuada, he creado mi propia biblioteca.https://github.com/curious-odd-man/RgxGen
También hay artefacto en maven central disponible.
Ejemplo de uso:
fuente
Sé que ya hay una respuesta aceptada, pero he estado usando el generador de datos de RedGate (el que se menciona en la respuesta de Craig) y funciona MUY bien para todo lo que le he dicho. Es rápido y eso me deja con ganas de usar la misma expresión regular para generar los datos reales para cosas como códigos de registro que escupe esta cosa.
Se necesita una expresión regular como:
y genera toneladas de códigos únicos como:
¿Es este un gran algoritmo secreto que RedGate descubrió y no tenemos suerte o es algo que nosotros, los simples mortales, realmente podríamos hacer?
fuente
Estoy en vuelo y acabo de ver la pregunta: he escrito la solución más fácil pero ineficiente e incompleta. Espero que pueda ayudarlo a comenzar a escribir su propio analizador:
fuente
Tendrá que escribir su propio analizador, como lo hizo el autor de String :: Random (Perl). De hecho, no usa expresiones regulares en ningún lugar de ese módulo, es solo a lo que están acostumbrados los codificadores de perl.
Por otro lado, tal vez puedas echar un vistazo a la fuente para obtener algunas sugerencias.
EDITAR: Maldita sea, Blair me ganó en el golpe por 15 segundos.
fuente
Está lejos de admitir una expresión regular de PCRE completa, pero escribí el siguiente método de Ruby para tomar una cadena similar a una expresión regular y producir una variación de ella. (Para CAPTCHA basado en el idioma).
fuente
Esta pregunta es muy antigua, pero me encontré con ella en mi propia búsqueda, por lo que incluiré un par de enlaces para otras personas que podrían estar buscando la misma funcionalidad en otros idiomas.
fuente
Si desea generar cadenas "críticas", puede considerar:
EGRET http://elarson.pythonanywhere.com/ que genera cadenas "malvadas" que cubren sus expresiones regulares
MUTREX http://cs.unibg.it/mutrex/ que genera cadenas de detección de fallas por mutación de expresiones regulares
Ambas son herramientas académicas (soy uno de los autores de la última) y funcionan razonablemente bien.
fuente