Generador de texto aleatorio basado en expresiones regulares

Me gustaría saber si hay software que, dado una expresión regular y, por supuesto, otras restricciones como la longitud, produce texto aleatorio que siempre coincide con la expresión regular dada. Gracias

Xeger es capaz de hacerlo:

String regex = "[ab]{4,6}c"; Xeger generator = new Xeger(regex); String result = generator.generate(); assert result.matches(regex); 

Todas las expresiones regulares se pueden express como gramáticas libres de contexto. Y hay un buen algoritmo ya resuelto para producir oraciones aleatorias, de cualquier CFG, de una longitud determinada. Así que convierta la expresión regular a cfg, aplique el algoritmo, y listo, listo.

Mira la gem RandExp Ruby. 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).

Si quieres una solución de Javascript, prueba randexp.js .

Sí, existe un software que puede generar una coincidencia aleatoria con una expresión regular:

  • Exrex , Python
  • Pxeger , Javascript
  • regex-genex , Haskell
  • Xeger , Java
  • Xeger , Python
  • Generex , Java
  • rxrdg , C #
  • Cadena :: Aleatorio , Perl
  • regldg , C
  • paggern , PHP
  • ReverseRegex , PHP
  • randexp.js , Javascript
  • EGRET , Python / C ++
  • MutRex , Java
  • Tarifa , C #
  • rstr , Python
  • randexp , Ruby
  • goregen , ve
  • bfgex , Java
  • regexgen , Javascript
  • Strgen , Python
  • cadena aleatoria , Java
  • regexp-unfolder , Clojure
  • cadena aleatoria , Haskell
  • rxrdg , C #
  • Regexp :: Genex , Perl
  • StringGenerator , Python
  • strrand , ir
  • Regen , ve
  • Rex , C #
  • expresiones regulares-ejemplos , Ruby

No conozco ninguno, 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.

Hace poco hicimos algo similar en Python para un juego RegEx 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. Aquí puede descargar el juego EXE completo y el código fuente de Python.

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 

Demasiado tarde, pero podría ayudar al recién llegado, aquí hay una útil biblioteca de Java que proporciona muchas características para usar expresiones regulares para generar String (generación aleatoria, generar cadenas basadas en su índice, generar todas las cadenas …) verifíquelas aquí .

Ejemplo:

  Generex generex = new Generex("[0-3]([ac]|[eg]{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 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 

En lugar de comenzar con una expresión regular, deberías buscar escribir una gramática gratuita de contexto pequeño, esto te permitirá generar fácilmente ese 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 “comstackdores del comstackdor” antes de continuar …