我需要在用户更改源文件时对源文件中的某些模式进行大量搜索,因此我需要进行时间和内存高效的正则表达式匹配。模式重复,所以应该编译一次,但我需要能够检索子部分(而不仅仅是确认匹配)
我正在考虑使用java.util.regexp或Jakarta perl5util(如果它仍然存在,我使用它已经过了几年),或者可能是Eclipse搜索引擎,虽然我怀疑它更聪明。
这两者之间是否存在显着的性能差异?
答案 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)。此外,它支持原子组和占有量词,我发现这两者都非常适合编写速度极快的正则表达式。它还支持预编译的正则表达式和捕获组,但我认为所有库都是如此。