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

38

我想知道是否有软件可以根据给定的正则表达式和其他限制条件(例如长度),生成始终匹配给定正则表达式的随机文本。

谢谢

9个回答

30

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

  • Fare,C#
  • rstr,Python
  • randexp,Ruby
  • goregen,Go
  • bfgex,Java
  • regexgen,Javascript
  • strgen,Python
  • random-string,Java
  • regexp-unfolder,Clojure
  • string-random,Haskell
  • rxrdg,C#
  • Regexp::Genex,Perl
  • StringGenerator,Python
  • strrand,Go
  • regen,使用Go语言实现
  • Rex,使用C#语言实现
  • regexp-examples,使用Ruby语言实现
  • genex.js,使用JavaScript语言实现
  • genex,使用Go语言实现

  • 21

    Xeger 可以完成这个任务:

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

    3
    根据使用的正则表达式,随机性会被扭曲。例如,正则表达式“[a-yZ]”将生成比其他字母多26倍的“Z”。请参见http://code.google.com/p/xeger/wiki/XegerLimitations。 - Twilite

    14
    所有正则表达式都可以表示为上下文无关文法。而且已经有一个很好的算法可以根据给定长度从任何CFG生成随机句子。因此,将正则表达式转换为CFG,应用该算法,然后完成即可。

    有没有已知的算法实现?这是不是一个冒险的尝试? - Paralife
    我几年前成功地在Perl中实现了它,并且它被用于“生产”,所以我可能做得没错。这个过程中最困难的部分是理解论文中使用的符号表示法。一旦跨过这个障碍,你就会很顺利。 - Jay Kominek
    1
    如果我找到了Perl的位置,我会告诉你的,但不要指望太多。 - Jay Kominek
    嗯,不能递归匹配(Perl 有它们)和条件语句一起工作来创建甚至不再是上下文自由的东西? - Joey

    8

    请查看RandExp Ruby gem。它可以做你想要的事情,但只能在有限的范围内使用。 (它不能处理所有可能的正则表达式,只能处理符合某些限制的正则表达式。)


    8
    如果您想要一个JavaScript解决方案,请尝试使用 randexp.js

    2

    虽然有些晚了,但这可能对新手有所帮助。这是一个有用的Java库,提供了许多功能来使用正则表达式生成字符串(随机生成、基于索引生成字符串、生成所有字符串等)。在这里查看。

    例子:

        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
    

    1
    我们不久前在Python中做过类似的事情,为了写一个RegEx游戏。我们有一个约束条件,就是正则表达式必须是随机生成的,选定的单词必须是真实的。你可以在这里下载完成的游戏EXEhere和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
    

    0

    不要从正则表达式开始,而应该考虑编写一个小的上下文无关文法,这将使您能够轻松生成随机文本。不幸的是,我不知道有什么工具可以直接为您做到这一点,因此您需要自己编写一些代码来实际生成文本。如果您之前没有使用过语法,我建议在继续之前阅读一些关于BNF格式和"编译器生成器"的内容...


    0

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接