2008-10-10 130 views
6

我需要對源文件中的某些模式進行大量搜索,而用戶正在更改它們,所以我需要執行regexp匹配,這在時間和內存方面非常有效。該模式重複自己,所以應該編譯一次,但我需要能夠檢索子部分(而不是隻是確認一個匹配)java.util.regexp是否足夠高效?

我正在考慮使用java.util.regexp或雅加達perl5util(如果它仍然存在,自從我使用它幾年以來),或者Eclipse的搜索引擎,儘管我懷疑ti是否聰明。

兩者之間是否有顯着的性能差異?

回答

9

我不確定在不同的正則表達式java引擎方面有巨大的性能差距。

但肯定的是構建時,正則表達式(那就是,如果數據足夠大,爲noted by Jeff Atwood)性能問題

你應該避免的唯一的事情是catastrophic backtracking,使用atomic grouping時最好避免。

因此,默認情況下,我會使用java.utils.regexp引擎,除非您有特定的perl兼容的正則表達式源,您需要在程序中重用。

然後我會仔細構建我打算使用的正則表達式。

但是在選擇一臺發動機的長期或另一...,因爲它has beensaidmany ...:

  • 「讓它工作,使之快 - 按順序」
  • 提防「過早優化」。
3

正如VonC所說,你需要知道你的正則表達式。預先編譯正則表達式並不會傷害。否則,每次編譯正則表達式的代價都會嚴重影響性能。

對於某些類別,有替代庫:http://jint.sourceforge.net/jint.html這可能會有更好的性能。然後再一次,這取決於你使用的是哪個版本的java。

JDK 1.6顯示了具有良好功能和性能的正則表達式引擎的成熟度。

2

總體而言,java.util.regex(非「regexp」)包至少與其他任何Java正則表達式庫一樣好,包括Jakarta ORO(您的「Perl5Util」lib)。此外,它支持原子組和佔有量詞,這兩種方法對於編寫快速正則表達式都是非常寶貴的。它還支持預編譯的正則表達式和捕獲組,但我認爲所有庫都是如此。