正则表达式性能优化提示和技巧

时间:2009-08-09 20:27:47

标签: regex performance optimization

在阅读了关于java中正则表达式优化的非常好的article之后,我想知道创建快速有效的正则表达式的其他好方法是什么?

3 个答案:

答案 0 :(得分:33)

  1. 当您需要重复分组但不需要使用来自传统(?:pattern)组的捕获值时,请使用非捕获组(capturing)
  2. 在适用的(?>pattern)时使用atomic group(或非回溯子表达式)。
  3. 通过将正则表达式设计为提前终止不匹配来避免像瘟疫一样catastrophic backtracking
  4. 我创建了一个展示这些技术的视频。我开始使用catastrophic backtracking文章(x+x+)+y中的非常写得不好的正则表达式。经过一系列的优化后,我将它的速度提高了300万倍,并在每次更改后进行基准测试。该视频特定于.NET,但其中许多内容也适用于大多数其他正则表达式:

    .NET Regex Lesson: #5: Optimization

答案 1 :(得分:7)

谨慎使用any(dot)操作符,如果你能以任何其他方式执行,那么,dot会一直咬你...

我不确定PCRE是否是NFA而且我只熟悉PCRE但是+和*默认情况下通常是贪婪的,它们会尽可能地匹配使用+?和*?为了尽可能地匹配,在编写你的正则表达式时要牢记这两个条款。

答案 2 :(得分:4)

知道何时使用正则表达式 - 有时手动编码的解决方案更有效,更易理解。

示例:假设您要匹配一个可被3整除的整数。设计一个有限状态机来完成此任务是微不足道的,因此必须存在相应的正则表达式,但写出来并不是那么微不足道 - 而且我“我一定不愿意调试它!”