Regex的性能问题

一、在web中,regex会有一些性能的问题,现在小总结一下,作为以后的提示

1、正则规则不变的情况下,表达式最好是一次编译,每次编译会很影响性能,大概十几倍的差别。

2、正则表达式的写法,也会有性能影响,详情看下文。

3、正则的调试工具,RegexBuddy,还挺好用的。

其实大概就三个点,就能搞定正则,但是详情的还挺多东西的

二、正则的一些细节规则

1、在写完最好测试一下回调次数,RegexBuddy工具还挺好的。
2、正则表达式以简单的、必需的字元开始
   最理想的情况是,一个正则表达式的起始字元应当尽可能快速地测试并排除明显不匹配的位置。用于此目的好的起始字元通常是一个锚(^或$)、特定字符(如x 或u363A)、字符类(如[a-z]或速记符、单词边界())。如果可能,避免以分组或选择字元开头,避免顶级分支,如/one|two/,因为这样会强迫正则表达式识别多种起始字元。Firefox浏览器对起始字元中使用的任何量词都很敏感,能够优化得更好。例如,以ss*替代s+或s{1,}。其他浏览器大多优化掉这些差异。

3、编写量词模板,使它们后面的字元互相排斥
  当字符与字元相邻或子表达式能够重叠匹配时,一个正则表达式尝试分解文本的路径数量将增加。为避免出现此现象,尽量具体化模板。当表达“[^" ]*”时不要使用“.*?”(依赖回溯)。

4、减少分支的数量,缩小它们的范围
   当分支使用 | (竖线)时,可能要求在字符串的每一个位置上测试所有的分支选项。通常可通过使用字符类和选项组件减少对分支的需求,或者将分支在正则表达式上的位置推后(允许到达分支之前的一些匹配尝试失败)。

字符类比分支更快,因为它们使用位向量实现(或其他快速实现)而不是回溯。当分支必不可少时,在不影响正则表达式匹配的情况下,将常用分支放在最前面。分支选项从左向右依次尝试,一个选项被匹配上的机会越多,它被检测的速度就越快。
注意:由于Chrome 和Firefox 浏览器自动执行这些优化中的某些项目,因此较少受到手工调整的影响。

5、使用非捕获组
  捕获组花费时间和内存用于记录后向引用,并保持它们是最新的。如果不需要一个后向引用,可通过使用非捕获组避免这种开销,例如,(?:…)替代(…)。当需要一个完全匹配的后向引用时,有些人喜欢将正则表达式包装在一个捕获组中,这是不必要的,因为可以通过其他方法引用完全匹配。例如,使用regex.exec()返回数组的第一个元素,或替换字符串中的$&。用非捕获组取代捕获组在Firefox 浏览器中影响很小,但在其他浏览器上处理长字符串时影响很大。

6、使用适当的量词
   正如建议45所讨论过的那样,“贪婪”量词和“懒惰”量词即使匹配同样的字符串,其查找匹配过程也是不同的。在确保正确等价的前提下,使用更合适的量词类型(基于预期的回溯次数)可以显著提高性能,尤其在处理长字符串时。

三、正则工具的使用

 http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_options.gif?_=5860893

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_match.gif?_=5860893

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_replace.gif?_=5860893

http://qiniu-img.zjmainstay.cn/regexbuddy/regexbuddy_view_debug.gif?_=5860893

四、当然了,正则必不可少的就是要有个语法表

 这个可以看看下一:http://www.cnblogs.com/wu-fm/p/6673938.html

ok,就这些。

有些内容转载自一下地址,谢谢这些博主的分享:

http://www.0430.com/cn/web246371/

http://www.cnblogs.com/tsql/p/5860893.html

原文地址:https://www.cnblogs.com/wu-fm/p/6673921.html