2

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

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

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

Regex 本身不应受到指责,因为它还有其他组件:

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

删除<faulty-part-above>在 0.7 秒内执行,添加它会回到 10+ 秒。

4

1 回答 1

1

此类问题的最常见原因是可以匹配多种方式的交替导致正则表达式引擎回溯太多。所以第一件事是你“看似无辜”的表达的上下文重要。

将看似无辜的表情放在交替中会有所不同吗?被搜索的字符串的长度在多大程度上有影响?

特别要注意交替中不同部分的量词。是否存在您的主题的一部分可能在交替的任何一部分中匹配的情况。(例如, * 可以匹配零个实例。你需要那个吗?看看交替之间的交互。

于 2012-05-15T21:15:57.823 回答