2012-04-15 55 views
0

這個正則表達式有什麼區別:/(everything|cool)/gi和這個:/(?:everything|cool)/gi正則表達式:性能

我問這個,因爲我有一個正則表達式,我無法給自己寫 *這和有,因爲你可以看到下面,很多?:在正則表達式。我讀過?:對性能不利的地方,所以我想刪除它。我可以刪除它,還是對任何事情都很重要?

* (?:(?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)(?:\\.|[^\\'"]))+

回答

4

沒有?:,創建了對匹配組的引用。
使用?:,該組匹配,但未捕獲。

這裏有兩種方法的基準:http://jsperf.com/regex-capture-vs-non-capture

通過觀察吧,一會說,非捕獲組更快。但是,如果你看看底部,可以忽略不同,因爲這兩種方法已經非常快。

刪除或添加?:到現有的解決方案可能會破壞代碼,所以我建議不要在沒有引起任何問題時編輯RegExp。

4

(?:...)是罰款。這是當捕獲羣體,特別是對它們的反向引用,讓你開始看到性能命中。

+0

非捕獲組更快速的關鍵在於它們允許RE引擎進行大量優化。捕獲組需要更多的信息由匹配器保存,並且會導致很多更復雜的優化(例如轉換爲單通DFA)。 – 2012-04-15 17:49:20

+0

奇怪的是,我發現一個非捕獲組的性能比甚至沒有組都要好。 :P http://jsperf.com/regex-capture-vs-non-capture/2(可能v8具體) – cHao 2012-04-15 17:51:16

+0

這是一個非常好奇的結果。我想知道是否有任何問題垃圾收集踢? (我懷疑那是當我在該頁面上運行測試時發生的事情......) – 2012-04-15 18:05:26

2

您應該聽說(foo)(?:foo)慢。這是因爲第一個是捕獲組,第二個是未捕獲組。第二個有更少的工作要做(它不需要記住匹配的文本),所以它應該更快。