为什么这个正则表达式导致我的正则表达式引擎挂起?

时间:2012-08-28 16:41:59

标签: regex

有没有人知道为什么这个正则表达式导致我的应用程序挂起?

/^(?:((?:.+?)(?: of the )?)+) of the (?:(.+?)) (?:"(.+?)")$/

当我尝试使用它来匹配这样的字符串时,它会挂起:

'description of the post "This is a Post"'

但是当我使用它来匹配这样的较短字符串时,似乎发生得非常快: 'age of the person "Bob"'

关于为什么会发生这种情况或如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

这是正则表达式中catastrophic backtracking的结果,正则表达式的以下部分可能是罪魁祸首:

((?:.+?)(?: of the )?)+

每次嵌套重复时,都应该尝试重构正则表达式。在这种情况下,我认为您可以将整个部分简化为.+,并使您的正则表达式的行为方式相同。

答案 1 :(得分:1)

这可能是因为有太多的回溯/分组需要花费大量时间来解析更大的字符串。

正如你在演示中看到的那样:http://regex101.com/r/xC3dF0,由于大量的回溯,系统无法解析字符串