簡體   English   中英

為什么/^(.+)+Q$/.test("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX)需要這么長時間?

[英]Why does /^(.+)+Q$/.test(“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”) take so long?

我跑的時候

/^(.+)+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")

如thg435所示,這聽起來像是災難性的回溯。 有一篇很好的文章, 正則表達式匹配可以簡單快速

它描述了一種稱為Thompson NFA的有效方法。 但是,如上所述,這並不支持現代正則表達式的所有功能。 例如,它無法進行反向引用。 但是,正如文章中所建議的那樣:

“即便如此,對於大多數正則表達式使用Thompson的NFA模擬是合理的,並且只在需要時才進行回溯。一個特別聰明的實現可以將兩者結合起來,僅僅為了適應反向引用而進行回溯。”

我懷疑Firefox可能會這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM