基于正则表达式的随机文本生成器

时间:2008-11-07 23:37:14

标签: regex

我想知道是否有软件,给定正则表达式,当然还有一些其他约束,如长度,产生始终匹配给定正则表达式的随机文本。 感谢

9 个答案:

答案 0 :(得分:20)

Xeger能够做到这一点:

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

答案 1 :(得分:12)

所有正则表达式都可以表示为无上下文语法。并且a nice algorithm already worked out用于从给定长度的任何CFG产生随机句子。所以将正则表达式上转换为cfg,应用算法,并且wham,你已经完成了。

答案 2 :(得分:9)

是的,存在可以生成与正则表达式的随机匹配的软件:

答案 3 :(得分:8)

查看RandExp Ruby gem。尽管只是以有限的方式,它可以满足您的需求。 (它不适用于所有可能的正则表达式,只有符合某些限制的正则表达式。)

答案 4 :(得分:8)

如果您需要Javascript解决方案,请尝试randexp.js

答案 5 :(得分:1)

我不知道,尽管它应该是可能的。通常的方法是编写语法而不是正则表达式,然后为每个非终端创建函数,随机决定要扩展哪个生产。如果您可以发布您想要生成的字符串种类的描述,以及您正在使用的语言,我们可能会帮助您入门。

答案 6 :(得分:1)

我们在不久前为我们编写的RegEx game在Python中做了类似的类似的。我们有一个约束,即必须随机生成正则表达式,并且所选单词必须是真实单词。您可以下载已完成的游戏EXE here和Python源代码here

这是一个片段:

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

答案 7 :(得分:1)

太晚了但它可以帮助新手,这里有一个有用的java library,提供了许多使用正则表达式生成String的功能(随机生成,根据它的索引生成String,生成所有String ..)检查出来here

示例:

    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

答案 8 :(得分:0)

您应该考虑编写一个小的无上下文语法,而不是从正则表达式开始,这将允许您轻松生成此类随机文本。不幸的是,我知道没有直接为你做的工具,所以你需要自己做一些代码来实际生成文本。如果您之前没有使用过语法,我建议您在继续阅读之前先阅读一下bnf格式和“编译器编译器”......