为了测试我正在进行的项目,如果给出正则表达式,我需要随机生成一个 FAIL 匹配的字符串。例如,如果我给了这个正则表达式:
^[abcd]d+
然后我应该能够生成如下字符串:
hnbbad
uduebbaef
9f8;djfew
skjcc98332f
...每个都与正则表达式不匹配,但不生成:
addr32
bdfd09usdj
cdddddd-9fdssee
...每个都做。换句话说,我想要一些像反Xeger的东西。
这样的库是否存在,最好是用Python(如果我能理解这个理论,我很可能在需要的时候把它转换成Python)?我考虑过如何写这个,但考虑到正则表达式的范围,似乎可能比Xeger可以解决的问题困难得多。我也四处寻找一个预制的库来做这件事,但要么我没有使用正确的关键词进行搜索,要么之前没有人遇到过这个问题。
答案 0 :(得分:6)
我最初的直觉是,不,这样的库不存在,因为它是不可能的。您无法确定在合理的时间内是否可以为任意正则表达式找到有效的输入。
例如,证明数字是否为素数被认为是难以解决的数学问题。以下正则表达式匹配任何长度至少为10000个字符且总长度为素数的字符串:
(?!(..+)\1+$).{10000}
我怀疑是否存在可以在合理的时间内找到此正则表达式的有效输入的库。这是一个非常简单的例子,有一个简单的解决方案,例如'x' * 10007
会奏效。有可能提出其他正则表达式,这些表达式很难找到有效的输入。
我认为你要解决这个问题的唯一方法是将自己局限于所有可能的正则表达式的某个子集。
但是说过 if 你有一个神奇的库来生成与任何任意正则表达式匹配的文本,那么你需要做的就是生成一个匹配的正则表达式不与原始表达式匹配的所有字符串。
幸运的是,这可能是使用否定前瞻:
^(?![\s\S]*(?:^[abcd]d+))
如果您愿意将需求更改为仅允许正则表达式的有限子集,则可以使用布尔逻辑来否定正则表达式。例如,如果^[abcd]d+
变为^[^abcd]|^[abcd][^d]
。然后可以在合理的时间内为此正则表达式找到有效的输入。
答案 1 :(得分:3)
我会做一个循环,生成随机长度的随机组合,并测试是否匹配正则表达式。重复循环,直到达到不匹配的情况。
显然,这样效率低下。你确定你不能反转正则表达式并在反转的正则表达式上产生匹配吗?
答案 2 :(得分:1)
不,这是不可能的。有无数个正则表达式匹配已知Universe中的每个字符串。例如:
/^/
/.*/
/[^"\\]*(\\.[^"\\]*)*$/
等
这是因为所有这些正则表达式都可以匹配什么都没有(这是所有字符串都有的!)
答案 3 :(得分:0)
我们可以通过限制从给定字符集生成字符串来减少无限多种可能性。
例如,我可以定义字符集[QWERTYUIOP!@#$%^%^&*))_]
,我随机生成的所有字符串都应该从这个集合中生成。这样我们可以减少这个问题的无限性吗?
事实上,即使我正在寻找这样的实用程序,最好是在Python中。