如何生成与给定正则表达式匹配的随机字符串?

时间:2009-04-14 15:57:23

标签: regex parsing random reverse

重复:

  

Random string that matches a regexp

不,不是。我正在寻找一种简单而通用的方法,我可以实际实现。这比随机生成密码困难得多。


我想创建一个采用正则表达式的应用程序,并显示10个与该表达式匹配的随机生成的字符串。它应该帮助人们更好地理解他们的regexp,并决定他们是否足够安全以进行验证。有谁知道一个简单的方法吗?

一个明显的解决方案是编写(或窃取)正则表达式解析器,但这似乎真的在我脑海中。

我再说一遍,我正在寻找一种简单且通用的方式来做到这一点。

编辑:蛮力方法是不可能的。假设随机字符串只是[a-z0-9]{10}和每秒100万次迭代,则需要65 years来迭代所有10个字符串的空间。

5 个答案:

答案 0 :(得分:24)

将正则表达式解析为DFA,然后随机遍历DFA,直到最终处于接受状态,为每次转换输出一个字符。每次遍历都会产生一个与表达式匹配的新字符串。

但这对于不常规的“常规”表达式不起作用,例如带有反向引用的表达式。这取决于你所追求的表达方式。

答案 1 :(得分:6)

看看Perl的String::Random

答案 2 :(得分:0)

可能或可能不实用的一个相当丑陋的解决方案是利用现有的正则表达式诊断选项。一些正则表达式库能够找出正则表达式无法匹配的位置。在这种情况下,你可以使用实际上是一种暴力形式,但是一次使用一个字符并尝试获得更长(并且进一步匹配)的字符串,直到你得到完全匹配。这是一个非常难看的解决方案。但是,与标准的暴力解决方案不同,它在字符串上的失败也会告诉您是否存在匹配的字符串ab。*(如果没有,则停止并尝试交流。如果是,请尝试更长的字符串)。对于所有正则表达式库,这可能不可行。

从好的方面来说,从教学的角度来看,这种解决方案可能非常酷。在实践中,它可能与dfa解决方案类似,但不需要考虑dfas。

请注意,您不希望使用此技术的随机字符串。但是,如果您跟踪在树中测试的内容,则可以使用随机字符开头,因此效果相同。

答案 3 :(得分:-1)

如果您的唯一标准是您的方法简单且通用,那么没有什么比蛮力更容易或更普遍了。 :)

for (i = 0; i < 10; ++i) {
    do {
        var str = generateRandomString();
    } while (!myRegex.match(str));
    myListOfGoodStrings.push(str);
}

当然,这是一种非常愚蠢的做事方式,主要是是一个笑话。

我认为你最好的选择是尝试编写自己非常基本的解析器,只教你期待遇到的事情(例如:字母和数字范围,重复/可选字符......不要担心关于后视等)

答案 4 :(得分:-2)

普遍性标准是不可能的。给定正则表达式"^To be, or not to be -- that is the question:$",将不会有十个唯一的随机字符串匹配。

对于非简并案例:

moonshadow与Perl的String :: Random的链接就是答案。从stdin读取RegEx并将来自10个String :: Random调用的输出写入stdout的Perl程序是微不足道的。使用Perl2exe将其编译为Windows或Unix exe,并从PHP,Python或其他任何内容调用它。

另见Random Text generator based on regex