什么是病态正则表达式会炸毁许多解析器(包括时间和内存)? 哪个解析器?奖励指出正则表达式越基本和标准,非恶意用户可能无辜地想出它。 随意发布实际时间和内存数据,以及解析器版本。
(我似乎记得在PERL中过度的后视断言或(EDIT :)回溯据说是这样做的,或者至少曾经是这样。还有其他吗?)
答案 0 :(得分:3)
来自Russ Cox的优秀article:$ perl -e '("a" x 100000) =~ /^(ab?)*$/;'
。这显然导致了一个段错误。文章中还有更多内容。
答案 1 :(得分:3)
改编自文章Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...)中的第一个示例:
perl -e '$n=29; ("a" x $n) =~ (("a?" x $n).("a" x $n))'
我的系统需要40多秒。然后$n++
以指数方式增加乐趣......
答案 2 :(得分:0)
我总是使用这个正则表达式匹配PHP中的PHP或JavaScript源代码中的字符串:
~'(\\.|[^'])*'|"(\\.|[^"])*"~s
它几乎总是在很长的字符串上失败(大约50000个字符长度)。