2008-10-10 160 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)。此外,它支持原子组和占有量词,这两种方法对于编写快速正则表达式都是非常宝贵的。它还支持预编译的正则表达式和捕获组,但我认为所有库都是如此。