2016-04-27 47 views
0

我正在寫一個CSV解析器,併爲了檢測我可以期望獲得的文件的不同數據類型,我有一個每個數據類型的地圖,每個包含正則表達式我將其定義爲有效且可識別的。例如,對於我的整數值,這裏是我的地圖:正則表達式效率使用交替與單個正則表達式

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$", "##0"); 
integerFormatRegexps.put("^-[1-9]\\d{1,9}$", "-##0"); 
integerFormatRegexps.put("^0$", "0"); 

現在,我已經見過幾個examples這裏,所以這裏的而不是這些正則表達式分離,他們使用的交替,在那裏,而不是三個正則表達式,我可以只使用一個:

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$", "Integer"); 

我的問題是這兩種方法的將是一般更有效,在Java的匹配模式是什麼時候?迭代通過單獨的簡單正則表達式來查找匹配項,還是僅匹配一個更復雜的正則表達式?

+3

什麼阻止你自己對兩個變體進行基準測試? –

+1

這是[Perl的類似問題](http://stackoverflow.com/questions/36420517/is-it-faster-to-use-alternation-than-subsequent-replacements-in-regular-expressi)。 *總結*:**請記住,你正在比較蘋果和橙子**。 –

+0

@Lashane來自SO的其他職位(包括Wiktor引用的職位,這似乎是一個非常具體的話題,而且需要很多經驗,實際上我可以自己衡量它,但是我應該怎麼衡量呢?非常具體,因爲我試圖提供一個例子,但它是一個普遍的問題,正如其名稱所暗示的那樣:在java正則表達式匹配中將使用交替命中性能嗎? – carlossierra

回答

1

首先,我不得不說,效率不太可能成爲您的問題。你的正則表達式相對簡單,並且在解壓縮之後,你似乎正在使用它們來隔離值。

也就是說,需要注意的是,不同的分支可以匹配相同的字符。最好的例子是(.|\s),有時由尚不知道DOTALL /單行模式(或[\S\s],如this question)的正則表達式初學者使用。把它放在另一個良性的正則表達式的中間,用它來搜索一個不是特別大的文本,然後看你的計算機變得緊張。

但是,您的示例正則表達式很好,因爲每個分支必須以不同的東西開頭([1-9],-0)。但正如我所說的,我認爲正則表達式的效率不會是一個問題。做你認爲更方便的事情;是更緊湊的代碼和更少數量的正則表達式對於更大,更難維護的正則表達式是合理的權衡?

還有一件事:如果您在緊密循環中反覆使用正則表達式,請務必使用緩存的Pattern對象;編譯它們的成本很高。實際上,考慮將它們存儲在Map中作爲模式而不是字符串。例如:

Pattern integerRegex = Pattern.compiile("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$"); 

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put(integerRegex, "Integer"); 

然後您可以使用靜態的Pattern.matches()方法來執行檢查。

+0

您能否分享一些關於答案的最後部分的示例代碼? – carlossierra