复制:

与正则表达式匹配的随机字符串

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


我想创建一个应用程序,它采用正则表达式,并显示 10 个与该表达式匹配的随机生成的字符串。它应该帮助人们更好地理解他们的正则表达式,并做出决定,即如果它们对于验证目的足够安全。有谁知道有一种简单的方法可以做到这一点?

一个明显的解决方案是编写(或窃取)正则表达式解析器,但这似乎超出了我的理解范围。

我再说一遍,我正在寻找一个 简单且通用 这样做的方法。

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

有帮助吗?

解决方案

解析正则表达式到 DFA ,然后遍历您的DFA随机直到在最终接受状态,输出用于每个转变的字符。各步行将产生的表达相匹配的新的字符串。

这不适用于“常规”表达式是不是真的有规律,但是,如用反向引用表达式工作。这取决于你是什么样的表情后。

其他提示

看看Perl的字符串::随机

一种比较难看溶液,其可以是或可以不是实际是利用现有的正则表达式的诊断信息。有些正则表达式库要弄清楚其中的正则表达式无法匹配的能力。在这种情况下,你的可能的使用什么是有效的蛮力一种形式,但使用一个字符的时间和努力来获得更长的(和进一步匹配)的字符串,直到你得到了全场比赛。这是一个非常丑陋的解决方案。然而,与一个标准的蛮力解决方案,它未能像AB字符串也会告诉你,是否存在一个字符串AB *将匹配(如果没有,停止并尝试交流。如果是这样,尝试更长的字符串)。这可能不是与所有的正则表达式的库是可行的。

在光明的一面,这种解决方案可能是从一个教学透视很酷。实际上它在影响到DFA的解决方案可能是相似的,但没有要求去思考的DFA。

请注意,你不会想使用随机字符串使用这种技术。但是,您可以使用随机字符入手,如果你跟踪你在树上已经测试过的东西,所以效果是一样的。

如果你唯一的标准是你的方法是容易的,普遍的,那么就没有什么更容易或更普遍比蛮力。 :)

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

当然,这是做事情非常愚蠢的方式的大多的是开个玩笑而已。

我认为最好的方法是尝试编写自己很基本的解析器,教学只是其中你希望遇到的事(例如:字母和数字范围,重复/可选字符......别担心关于查找屁股等)

的普遍性准则是不可能的。由于正则表达式“^生存还是毁灭 - 这是个问题:$” 时,不会有匹配10个的不同的随机串。

对于非简并情况:

月影的链接,Perl的字符串::随机就是答案。一个Perl程序,从标准输入读取一个正则表达式和字符串::随机十次调用将输出写入到stdout是微不足道的。编译到Windows或Unix的EXE与 Perl2exe 和从PHP,Python或调用它不管。

另请参见基于正则表达式随机文本发生器

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top