Gerador de texto random baseado em regex

Eu gostaria de saber se existe um software que, dado um regex e, claro, algumas outras restrições, como length, produz texto random que sempre corresponde ao regex dado. obrigado

Xeger é capaz de fazer isso:

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

Todas as expressões regulares podem ser expressas como gramáticas livres de contexto. E há um bom algoritmo já elaborado para produzir sentenças aleatórias, a partir de qualquer CFG, de um determinado comprimento. Então, upconvert o regex para um cfg, aplique o algoritmo, e wham, você está feito.

Confira a gema RandExp Ruby. Ele faz o que você quer, embora apenas de forma limitada. (Não funciona com todos os regexp possíveis, apenas regexps que atendem a algumas restrições.)

Se você quer uma solução Javascript, tente randexp.js .

Sim, existe software que pode gerar uma correspondência aleatória para um regex:

  • Exrex , Python
  • Pxeger , Javascript
  • regex-genex , Haskell
  • Xeger , Java
  • Xeger , Python
  • Generex , Java
  • rxrdg , c #
  • Corda :: Aleatório , Perl
  • regldg , C
  • paggern , PHP
  • ReverseRegex , PHP
  • randexp.js , Javascript
  • EGRET , Python / C ++
  • MutRex , Java
  • Tarifa , c #
  • rstr , Python
  • Randexp , Ruby
  • Goregen , Vá
  • bfgex , Java
  • regexgen , Javascript
  • strgen , Python
  • string aleatória , Java
  • regexp-unfolder , Clojure
  • seqüência aleatória , Haskell
  • rxrdg , c #
  • Regexp :: Genex , Perl
  • StringGenerator , Python
  • Estreito , Vá
  • Regen , Go
  • Rex , c #
  • exemplos de regexp , Ruby

Não tenho conhecimento de nenhum, embora seja possível. A abordagem usual é escrever uma gramática em vez de uma expressão regular e, em seguida, criar funções para cada não-terminal que decide aleatoriamente qual produção expandir. Se você pudesse postar uma descrição dos tipos de strings que você deseja gerar e qual idioma você está usando, talvez possamos começar.

Fizemos algo semelhante no Python há não muito tempo para um jogo RegEx que escrevemos. Nós tínhamos a restrição de que a regex tinha que ser gerada aleatoriamente, e as palavras selecionadas tinham que ser palavras reais. Você pode baixar o jogo concluído EXE aqui e o código fonte do Python aqui .

Aqui está um trecho:

 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 

Muito tarde, mas poderia ajudar o recém-chegado, aqui está uma biblioteca java útil que fornece muitos resources para usar o regex para gerar String (geração aleatória, gerar String com base em seu índice, gerar todas as String ..) confira aqui .

Exemplo:

  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 

Em vez de começar a partir de um regexp, você deve procurar escrever uma pequena gramática livre de contexto, o que permitirá que você gere facilmente esse texto random. Infelizmente, eu não conheço nenhuma ferramenta que faça isso diretamente para você, então você precisaria fazer um pouco de código para gerar o texto. Se você não trabalhou com grammers antes, eu sugiro que você leia um pouco sobre o formato bnf e “compiladores compilador” antes de prosseguir …