Me gustaría saber si hay software que, con una expresión regular y, por supuesto, otras restricciones como la longitud, produzca texto aleatorio que siempre coincida con la expresión regular dada. GraciasGenerador de texto aleatorio basado en la expresión regular
Respuesta
Xeger es capaz de hacerlo:
String regex = "[ab]{4,6}c";
Xeger generator = new Xeger(regex);
String result = generator.generate();
assert result.matches(regex);
En lugar de comenzar con una expresión regular, debe buscar escribir una gramática libre de contexto pequeño, esto le permitirá generar fácilmente dicho texto aleatorio. Lamentablemente, no conozco ninguna herramienta que lo haga directamente por usted, por lo que tendrá que hacer un poco de código para generar realmente el texto. Si no ha trabajado con gramáticas anteriormente, le sugiero que lea un poco sobre el formato bnf y los "compiladores del compilador" antes de continuar ...
No conozco ninguna, aunque debería ser posible. El enfoque habitual es escribir una gramática en lugar de una expresión regular, y luego crear funciones para cada terminal no terminal que decida aleatoriamente qué producción expandir. Si puede publicar una descripción de los tipos de cadenas que desea generar y el idioma que está utilizando, es posible que podamos comenzar.
Hicimos algo similar en Python no hace mucho tiempo para un RegEx game que escribimos. Teníamos la restricción de que la expresión regular tenía que generarse aleatoriamente, y las palabras seleccionadas tenían que ser palabras reales. Puede descargar el juego completo EXE here y el código fuente de Python here.
Aquí hay un fragmento:
def generate_problem(level):
keep_trying = True
while(keep_trying):
regex = gen_regex(level)
# print 'regex = ' + regex
counter = 0
match = 0
notmatch = 0
goodwords = []
badwords = []
num_words = 2 + level * 3
if num_words > 18:
num_words = 18
max_word_length = level + 4
while (counter < 10000) and ((match < num_words) or (notmatch < num_words)):
counter += 1
rand_word = words[random.randint(0,max_word)]
if len(rand_word) > max_word_length:
continue
mo = re.search(regex, rand_word)
if mo:
match += 1
if len(goodwords) < num_words:
goodwords.append(rand_word)
else:
notmatch += 1
if len(badwords) < num_words:
badwords.append(rand_word)
if counter < 10000:
new_prob = problem.problem()
new_prob.title = 'Level ' + str(level)
new_prob.explanation = 'This is a level %d puzzle. ' % level
new_prob.goodwords = goodwords
new_prob.badwords = badwords
new_prob.regex = regex
keep_trying = False
return new_prob
Mira la RandExp Rubí joya. Hace lo que quiere, aunque solo de manera limitada. (No funcionará con todas las expresiones regulares posibles, solo las expresiones regulares que cumplan algunas restricciones).
Se movió: http://github.com/benburkert/randexp –
Todas las expresiones regulares se pueden expresar como gramáticas libres de contexto. Y existe a nice algorithm already worked out para producir oraciones aleatorias, desde cualquier CFG, de una longitud determinada. Así que convierta la expresión regular a cfg, aplique el algoritmo, y listo, listo.
¿Alguna implementación conocida del algo? ¿Es esto una posibilidad remota? – Paralife
Lo implementé con éxito en Perl hace años, y vio el uso de 'producción', así que probablemente lo hice bien. La parte más difícil del proceso fue comprender la notación utilizada en el documento. Despeja ese obstáculo y estás dorado. –
Si descubro dónde está el Perl, lo arrojaré, pero no cuente con nada. –
Si desea una solución Javascript, tratar randexp.js.
demasiado tarde pero podría ayudar a recién llegado, aquí es una utilidad java library que proporcionan muchas características para el uso de expresiones regulares para generar String (generación aleatoria, generar cadena basada en ella de índice, generar toda cadena ..) a verlo here.
Ejemplo:
Generex generex = new Generex("[0-3]([a-c]|[e-g]{1,2})");
// generate the second String in lexicographical order that match the given Regex.
String secondString = generex.getMatchedString(2);
System.out.println(secondString);// it print '0b'
// Generate all String that matches the given Regex.
List<String> matchedStrs = generex.getAllMatchedStrings();
// Using Generex iterator
Iterator iterator = generex.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
// it print 0a 0b 0c 0e 0ee 0e 0e 0f 0fe 0f 0f 0g 0ge 0g 0g 1a 1b 1c 1e
// 1ee 1e 1e 1f 1fe 1f 1f 1g 1ge 1g 1g 2a 2b 2c 2e 2ee 2e 2e 2f 2fe 2f 2f 2g
// 2ge 2g 2g 3a 3b 3c 3e 3ee 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 3g 1ee
// Generate random String
String randomStr = generex.random();
System.out.println(randomStr);// a random value from the previous String list
Sí, existe un software que puede generar una coincidencia aleatoria a una expresión regular:
- Exrex, Python
- Pxeger, Javascript
- regex-genex, Haskell
- Xeger, J ava
- Xeger, Python
- Generex, Java
- rxrdg, C#
- String::Random, Perl
- regldg, C
- paggern, PHP
- ReverseRegex, PHP
- randexp.js, Javascript
- EGRET, Python/C++
- MutRex, Java
- Fare, C#
- rstr, Python
- randexp, Ruby
- goregen, Ir
- bfgex, Java
- regexgen, Javascript
- strgen, Python
- random-string, Java
- regexp-unfolder, Clojure
- string-random, Haskell
- rxrdg, C#
- Regexp::Genex, Perl
- StringGenerator, Python
- strrand, Ir
- regen, Ir
- Rex, C#
- regexp-examples, Ruby
- 1. Generador de texto aleatorio
- 2. generador/reductor de expresión regular?
- 3. ¿Cómo puedo generar texto que coincida con una expresión regular de una expresión regular?
- 4. Generador Aleatorio Rápido
- 5. Mejor generador aleatorio PHP
- 6. - (guión) en la expresión regular
- 7. Generador de C# aleatorio real
- 8. Expresión regular en la función de índice
- 9. Cómo escanear texto para la expresión regular en Java
- 10. Expresión regular para extraer texto entre corchetes
- 11. Expresión regular para devolver texto entre paréntesis
- 12. Expresión regular para la URL
- 13. coincidencia de expresión regular en la
- 14. expresión regular "contiene" otra expresión regular
- 15. ¿Expresión regular para encontrar una expresión regular?
- 16. copia de Emacs con expresión regular
- 17. Comprueba si una expresión regular cubre otra expresión regular
- 18. Expresión regular para el reconocimiento de citas en el texto
- 19. Multilínea expresión regular en C#
- 20. Expresión regular: cualquier texto para ser amigable con la URL
- 21. expresión regular en iOS
- 22. distancia de Levenshtein en la expresión regular
- 23. expresión regular encuentra la pregunta de contenido
- 24. expresión regular para no espacio en blanco b/w texto
- 25. Crear expresión regular de la cadena
- 26. expresión regular para encontrar el URL en un texto
- 27. Cuándo usar el generador de analizador, ¿cuándo es suficiente la expresión regular?
- 28. TCL espera la expresión regular
- 29. Coincidir con la expresión regular
- 30. Distancia entre la expresión regular
pregunta duplicado: http://stackoverflow.com/questions/22115/using-regex-to-generate-strings-rather-than- match-them –