2013-03-03 56 views
2

爲什麼格局Java的正則表達式或太慢

[0123]123456|98765 

是執行[0123] 123456然後98765在Java中兩次慢?因此,單獨搜索它們比用OR執行要快。有人有解釋嗎?

UPD

見與結果檢驗例如: https://gist.github.com/cy6erGn0m/5077720

UPD2

我發現原因是內部java.util.regex中。下面的測試表明:https://gist.github.com/cy6erGn0m/5083426

所以你可以看到匹配器對源字符序列做出更多的請求。所以第一個模式比兩個獨立模式需要多出兩倍的源請求。

多行和不區分大小寫不相關。或運營商影響複雜性。

+1

這是你的確切模式?你如何測試它? – Qtax 2013-03-03 16:32:27

+0

在搜索字符串匹配的用例中,確實存在差異(儘管我的計算機速度並不慢)。 https://gist.github.com/anonymous/5076963關於ideone:http://ideone.com/447pPO – nhahtdh 2013-03-03 17:03:55

+0

我的測試看起來像由nhahtdh提供。我的結果表明,第一種模式大約慢了2-3倍。在我自己的測試平均時間內:2700ms vs 950ms – 2013-03-03 19:09:43

回答

2

好的。看起來我發現答案的一半。

當我們只有像123456這樣的模式時,正則表達式引擎使用Boyer-Moore字符串匹配算法。但如果你有或然後它不使用它,並簡單地比較每個字符。

由於它的天性,Boyer-Moore algorythm可能更有效率,所以這就是爲什麼第二種方法更快。

例如,如果我有輸入字符串「11223344」和模式「123456」,那麼根據Boyer-Moore實現,應該檢查的唯一字符在第5個位置是'3'。這比嘗試針對每個字符測試模式要有效得多。