当我在铬或IE运行
/^(.+)+Q$/.test("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
,它需要约10秒内完成。 (Firefox几乎可以立即评估它。)
为什么需要这么长时间? (为什么/如何Firefox能够这么做呢?)
(当然,我从来没有运行这个特定的正则表达式,但我遇到了类似的问题,与URL正则表达式在http://daringfireball.net/2010/07/improved_regex_for_matching_urls,它似乎归结到这一点,也就是,这将导致浏览器锁定某些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")
http://www.regular-expressions.info/catastrophic.html – georg 2012-04-18 21:28:57
一个原因可能是它做了很多回溯。这并不能解释为什么Firefox更快。也许他们有一些额外的优化。如果你想了解更多关于正则表达式引擎的内部工作原理,我建议阅读http://shop.oreilly.com/product/9780596528126.do – 2012-04-18 21:29:05
@thg发布这个答案,请 – 2012-04-18 21:30:50