【问题标题】:Regex Performance Optimization Tips and Tricks [closed]正则表达式性能优化提示和技巧 [关闭]
【发布时间】:2010-11-18 03:23:17
【问题描述】:

在阅读了一篇相当不错的article 关于 java 中的正则表达式优化之后,我想知道创建快速高效的正则表达式的其他好技巧是什么?

【问题讨论】:

  • 我想提一下Boolean Sequence,它目前支持的RE符号较少,但它们快速灵活,并且充满了许多有用的功能。您可以编写自己的匹配器来添加更多功能或使它们更快。它们还进行自动优化,您可以看到它们是如何使用 json 或基于 json 的图表进行评估的。

标签: regex performance optimization


【解决方案1】:

谨慎使用任何(点)运算符,如果你能以任何其他方式做到这一点,那就去做吧,点总是会咬你...

我不确定 PCRE 是否是 NFA,我只熟悉 PCRE,但是 + 和 * 通常默认情况下是贪婪的,它们会尽可能匹配以扭转这种情况使用 +?和 *?为了尽可能少地匹配,请在编写正则表达式时牢记这两个子句。

【讨论】:

    【解决方案2】:

    知道何时使用正则表达式——有时手工编码的解决方案更有效且更易于理解。

    示例:假设您想要匹配一个可以被 3 整除的整数。设计一个有限状态机来完成此操作很简单,因此必须存在相应的正则表达式,但将其写出来并不是那么简单——而且我肯定不想调试它!

    【讨论】:

    • 是的......但在某些数字系统中它是微不足道的。 :-P
    • 你的意思是:(((0|3|6|9)|((1|4|7)(0|3|6|9)*(2|5|8)))|(((2|5|8)|((1|4|7)(0|3|6|9)*(1|4|7)))((0|3|6|9)|((2|5|8)(0|3|6|9)*(1|4|7)))*((1|4|7)|((2|5|8)(0|3|6|9)*(2|5|8)))))*? (是的,我做了一个 DFA,然后是 GNFA,然后是正则表达式:p)
    • 在没有反向引用时使用快速实现。 swtch.com/~rsc/regexp/regexp1.html
    【解决方案3】:
    1. 当您需要重复分组但不需要使用来自传统(capturing) 组的捕获值时,请使用非捕获组(?:pattern)
    2. 在适用时使用atomic group(或非回溯子表达式)(?>pattern)
    3. 避免catastrophic backtracking 像瘟疫一样通过设计正则表达式来提前终止不匹配。

    我制作了一个视频来演示这些技术。我从catastrophic backtracking 文章(x+x+)+y 中写得很糟糕的正则表达式开始very。然后经过一系列优化,我将其速度提高了 300 万倍,每次更改后进行基准测试。该视频特定于 .NET,但其中许多内容也适用于大多数其他正则表达式风格:

    .NET Regex Lesson: #5: Optimization

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-02
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2010-12-14
      • 2010-10-08
      相关资源
      最近更新 更多