看似无辜的.NET正则表达式爆炸页面响应时间10倍

时间:2012-04-19 20:22:22

标签: c# .net regex

我将页面响应时间从0.7秒推迟到10秒,缩小了这个表达式(在一个更大的正则表达式中):

[^\.]{10,}[\.\?\!]\s*$

它的目的是检测一个至少10个字符长的句子(我知道它不完美,并且会从自然语言解析中受益)......但是这个表达式究竟是什么导致页面响应时间像那样爆炸?

正则表达本身并不应该受到指责,因为它有其他组成部分:

private static Regex innerTextFilterEx = new Regex(@"part1|part2|<faulty-part-above>", RegexOptions.Compiled | RegexOptions.IgnoreCase);

删除<faulty-part-above>会在0.7秒后执行,将其添加回10秒以上。

1 个答案:

答案 0 :(得分:1)

导致此类问题的最常见原因是交替可以匹配多种方式导致正则表达式引擎回溯过多。所以首先,你的“看似无辜”的表达的背景是重要的。

在交替中把看似无辜的表达放在首位会有所作为吗?被搜索字符串的长度在多大程度上有所不同?

特别要注意交替的不同部分的量词。是否存在部分主题在替换的任一部分中可能匹配的情况。 (例如,*可以匹配某些事物的零实例。你需要吗?看看替代品之间的相互作用。