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

ser*_*erg 18 regex optimization performance

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

Ste*_*ham 33

  1. 使用非捕获组(?:pattern)时,你需要重复一组,但并不需要使用来自一个传统的捕捉值(capturing)组.
  2. 适用时使用原子组(或非回溯子表达式)(?>pattern).
  3. 通过设计你的正则表达式来提前终止非匹配,避免像瘟疫一样的灾难性回溯.

我创建了一个展示这些技术的视频.我在灾难性的回溯文章中用非常糟糕的正则表达式开始.经过一系列的优化后,我将它的速度提高了300万倍,并在每次更改后进行基准测试.该视频特定于.NET,但其中许多内容也适用于大多数其他正则表达式:(x+x+)+y

.NET Regex课程:#5:优化


Que*_*ark 7

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

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


Jim*_*wis 6

知道什么时候使用正则表达式——有时手工编码的解决方案更有效也更容易理解。

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

  • 你的意思是:`(((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) (11认同)