java.util.regex足够高效吗?

时间:2008-10-10 05:18:42

标签: java regex

我需要在用户更改源文件时对源文件中的某些模式进行大量搜索,因此我需要进行时间和内存高效的正则表达式匹配。模式重复,所以应该编译一次,但我需要能够检索子部分(而不仅仅是确认匹配)

我正在考虑使用java.util.regexp或Jakarta perl5util(如果它仍然存在,我使用它已经过了几年),或者可能是Eclipse搜索引擎,虽然我怀疑它更聪明。

这两者之间是否存在显着的性能差异?

3 个答案:

答案 0 :(得分:9)

我不确定在不同的正则表达式java引擎方面存在巨大的性能差距。

但构建正则表达式时确实存在性能问题(即,如果数据足够大,则为noted by Jeff Atwood

唯一应避免的是catastrophic backtracking,使用atomic grouping时最好避免使用。

所以,默认情况下我会使用java.utils.regexp引擎,除非你有特定的perl兼容的regexp源,你需要在你的程序中重用。

然后我会仔细构建我打算使用的正则表达式。

但是在has been said中选择一个引擎或其他引擎...... many other questions ...:

  • “让它工作,快速 - 按顺序”
  • 小心“过早优化”。

答案 1 :(得分:3)

正如VonC所说,你需要了解你的正则表达式。事先编译正则表达式并没有什么坏处,每次编译正则表达式的成本都会严重损害性能。

对于某些类别,有备用库:http://jint.sourceforge.net/jint.html可能具有更好的性能。然后,它取决于您正在使用的java版本。

JDK 1.6显示了正则表达式引擎的成熟度,它具有良好的功能和性能。

答案 2 :(得分:2)

总的来说,java.util.regex(不是“regexp”)包至少和其他任何Java正则表达式库一样好,包括Jakarta ORO(你的“Perl5Util”lib)。此外,它支持原子组和占有量词,我发现这两者都非常适合编写速度极快的正则表达式。它还支持预编译的正则表达式和捕获组,但我认为所有库都是如此。