【发布时间】:2012-04-19 09:14:21
【问题描述】:
当我跑步时
/^(.+)+Q$/.test("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
在 Chrome 或 IE 中,大约需要 10 秒才能完成。 (Firefox 几乎可以立即对其进行评估。)
为什么需要这么长时间? (以及 Firefox 为何/如何能够如此迅速地做到这一点?)
(当然,我永远不会运行这个特定的正则表达式,但我在http://daringfireball.net/2010/07/improved_regex_for_matching_urls 遇到了与 URL 正则表达式类似的问题,它似乎归结为这一点,即某些 URL 会导致浏览器锁定)
例如:
var re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
re.test("http://google.com/?q=(AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
【问题讨论】:
-
一个原因可能是它做了很多回溯。这并不能解释为什么 Firefox 更快。也许他们有一些额外的优化。如果您想了解更多关于正则表达式引擎的内部工作原理,我建议您阅读shop.oreilly.com/product/9780596528126.do
-
@thg 将此作为答案发布,请
-
任何在
(x+x+)+y上命中“灾难性回溯”的正则表达式引擎根本不值得一提。该正则表达式不需要任何回溯。如果通过 NFA 模拟器实现,而不是作为 DFA 实现,则不会。 -
这是一种求知欲的练习吗?如果不是,请解释您为什么使用该正则表达式,因为它看起来很可怕,因为
/.+Q$/可以正常工作,甚至可能只是/Q$/。
标签: javascript regex webkit