什么是导致许多解析器(包括时间和内存)崩溃的病态正则表达式?哪些解析器?标准越基础,非恶意用户使用可能性越大,加分项。可以发布实际的时间和内存数据以及解析器版本。
(我记得在PERL中过多的回溯或向后查找断言会导致这种情况,或者至少曾经如此。还有其他原因吗?)
本文内容翻译自文章正则表达式匹配可以简单快速(但在Java、Perl、PHP、Python、Ruby等语言中较慢)的第一个示例:
perl -e '$n=29; ("a" x $n) =~ (("a?" x $n).("a" x $n))'
在我的系统上需要40多秒。然后使用$n++
进行指数级增长的乐趣...
a?a?
简化为 a{,2}
是如此基础,以至于在课程中都会教授。 - Glenn Maynard从Russ Cox的精彩文章中得知:$ perl -e '("a" x 100000) =~ /^(ab?)*$/;'。这显然会导致段错误。 文章中还有更多类似的情况。
re.match(r'^(ab?)*$', 'a'*10000000)
- Glenn Maynard我经常使用这个正则表达式来匹配 PHP 或 JavaScript 源代码中的字符串:
~'(\\.|[^'])*'|"(\\.|[^"])*"~s
而且它几乎总是在一个非常长的字符串上失败(大约50000个字符长度就足够了)。