【问题标题】:Is java.util.regexp efficient enough?java.util.regexp 是否足够高效?
【发布时间】:2023-03-15 20:20:01
【问题描述】:

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

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

两者之间有什么显着的性能差异吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

    但是在构造正则表达式时肯定存在性能问题(也就是说,如果数据足够大,如noted by Jeff Atwood

    你应该避免的唯一事情是catastrophic backtracking,最好避免使用atomic grouping

    因此,默认情况下,我会使用 java.utils.regexp 引擎,除非您有特定的符合 perl 的 regexp 源需要在程序中重用。

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

    但是在选择一个或另一个引擎方面......就像has been said in many other questions...:

    • “让它工作,让它快速 - 按这个顺序”
    • 谨防“过早优化”。

    【讨论】:

      【解决方案2】:

      总体而言,java.util.regex(不是“regexp”)包至少与任何其他 Java regex 库一样好,包括 Jakarta ORO(您的“Perl5Util”库)。此外,它同时支持原子组和所有格量词,我发现这两者对于编写极快的正则表达式非常宝贵。它还支持预编译的正则表达式和捕获组,但我认为所有库都是如此。

      【讨论】:

        【解决方案3】:

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

        对于某些类别,有备用库:http://jint.sourceforge.net/jint.html 可能具有更好的性能。再说一次,这取决于您使用的 java 版本。

        JDK 1.6 展示了正则表达式引擎的成熟度,结合了良好的特性和性能。

        【讨论】:

          猜你喜欢
          • 2016-12-08
          • 2018-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-18
          • 2018-04-11
          • 2010-11-27
          相关资源
          最近更新 更多