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

Regex 基于正则表达式的随机文本生成器,regex,Regex,我想知道是否有一个软件,给定一个正则表达式,当然还有一些其他的限制,比如长度,生成总是与给定正则表达式匹配的随机文本。 谢谢不要从regexp开始,您应该考虑编写一个小的上下文无关语法,这将允许您轻松生成这样的随机文本。不幸的是,我知道没有任何工具可以直接为您完成这项工作,因此您需要自己编写一些代码来实际生成文本。如果您以前没有使用过语法,我建议您在继续之前阅读一点关于bnf格式和“编译器”的知识…我不知道有什么,尽管这应该是可能的。通常的方法是编写语法而不是正则表达式,然后为每个非终端创建函数

我想知道是否有一个软件,给定一个正则表达式,当然还有一些其他的限制,比如长度,生成总是与给定正则表达式匹配的随机文本。
谢谢

不要从regexp开始,您应该考虑编写一个小的上下文无关语法,这将允许您轻松生成这样的随机文本。不幸的是,我知道没有任何工具可以直接为您完成这项工作,因此您需要自己编写一些代码来实际生成文本。如果您以前没有使用过语法,我建议您在继续之前阅读一点关于bnf格式和“编译器”的知识…

我不知道有什么,尽管这应该是可能的。通常的方法是编写语法而不是正则表达式,然后为每个非终端创建函数,这些函数随机决定扩展哪个产品。如果您可以发布您想要生成的字符串类型的描述,以及您正在使用的语言,我们也许可以让您开始学习。

不久前,我们在Python中为我们编写的一篇文章做了类似的工作。我们有一个限制,正则表达式必须随机生成,所选单词必须是真实单词。您可以下载完整的游戏EXE,以及Python源代码

以下是一个片段:

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
def生成问题(级别):
继续努力
同时(继续尝试):
正则表达式=一般正则表达式(级别)
#打印“regex=”+regex
计数器=0
匹配=0
不匹配=0
goodwords=[]
坏话=[]
单词数=2+级别*3
如果单词数>18:
字数=18
最大单词长度=级别+4
而(计数器<10000)和((匹配最大单词长度:
持续
mo=重新搜索(正则表达式、随机词)
如果是mo:
匹配+=1
如果len(goodwords)
查看Ruby gem。它做你想做的,尽管只是以有限的方式。(它不适用于所有可能的regexp,只有满足某些限制的regexp。)

所有正则表达式都可以表示为上下文无关语法。还有一种方法可以从任何给定长度的CFG中生成随机句子。因此,将正则表达式向上转换为cfg,应用算法,然后砰,就完成了。

能够做到:

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

如果您想要一个Javascript解决方案,请尝试。

太晚了,但它可以帮助新手,这里有一个有用的工具,它提供了许多使用正则表达式生成字符串的功能(随机生成、基于其索引生成字符串、生成所有字符串…)请查看

例如:

    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
generax-generax=newgenerax([0-3]([a-c]|[e-g]{1,2})”;
//按字典顺序生成与给定正则表达式匹配的第二个字符串。
String secondString=generax.getMatchedString(2);
System.out.println(第二个字符串);//它打印“0b”
//生成与给定正则表达式匹配的所有字符串。
List matchedStrs=generax.getAllMatchedStrings();
//使用Generex迭代器
迭代器迭代器=generex.Iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+);
}
//它可以打印0a 0b 0c 0e 0e 0e 0f 0fe 0f 0g 0g 0g 0g 1a 1b 1c 1e
//1ee 1e 1e 1e 1f 1f 1g 1g 1g 2a 2b 2c 2e 2e 2e 2f 2f 2f 2f 2f 2g
//2ge 2g 2g 3a 3b 3c 3e 3e 3f 3fe 3f 3f 3g 3ge 3g 1ee
//生成随机字符串
字符串randomStr=generax.random();
System.out.println(randomStr);//上一个字符串列表中的随机值

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

  • ,蟒蛇
  • ,Javascript
  • ,Haskell
  • ,爪哇
  • ,蟒蛇
  • ,爪哇
  • ,C#
  • ,Perl
  • ,C
  • ,PHP
  • ,PHP
  • ,Javascript
  • ,Python/C++
  • ,爪哇
  • ,C#
  • ,蟒蛇
  • ,红宝石
  • ,走
  • ,爪哇
  • ,Javascript
  • ,蟒蛇
  • ,爪哇
  • ,Clojure
  • ,Haskell
  • ,C#
  • ,Perl
  • ,蟒蛇
  • ,走
  • ,走
  • ,C#
  • ,红宝石
  • ,JavaScript
  • ,走

算法的任何已知实现?这是一个长远的目标吗?几年前,我成功地用Perl实现了它,它看到了“生产”的使用,所以我可能做得对。过程中最困难的部分是理解论文中使用的符号。清除了这个障碍,你就成功了。如果我知道Perl在哪里,我会说出来,但不要指望任何东西。嗯,递归匹配(Perl有它们)和条件不能一起工作来创建一些甚至不再与上下文无关的东西吗?取决于所使用的正则表达式,随机性将被扭曲。例如,正则表达式“[a-yZ]”将生成比其他字母多26倍的“Z”。看见