正则表达式的优化总的来说就是尽可能精确,减少回溯次数,具体来说主要是以下几点:
- 如果你的正则工具支持,在不需要引用括号内文本的时候使用非捕获型括号:(?:expression) 。
- 如果括号是非必须的,请不要加括号。
- 不要滥用字符数组,比如[.],请直接用. 。
- 使用锚点^ $ ,这会加速定位。
- 从两次中提取必须元素,如:x+写成xx*,a{2,4}写成aa{0,2}。
- 提取多选结构开头的相同字符,如the|this 改成th(?:e|is)。(如果你的正则引擎不支持这么使用就改成th(e|is));尤其是锚点,一定要独立出来,这样很多正则编译器会根据锚点进行特别的优化: ^123|^abc 改成^(?:123|abc)。同样的$也尽量独立出来。
- 多选结构后边的一个表达式放入多选结构内,这样能够在匹配任何一个多选结构的时候在不退出多选结构的状态下查看后一匹配,匹配失败的更快。这种优化需要谨慎使用。
- 忽略优先匹配和优先匹配需要你视情况而定。如果你不确定,请使用匹配优先,它的速度是比忽略优先快的。
- 拆分较大正则表达式成一个个小的正则表达式,这是非常有利于提高效率的。
- 模拟锚点,使用合适的环视结构来预测合适的开始匹配位置,如匹配十二个月份,可以先预查首字符是否匹配:(?=JFMASOND)(?:Jan|Feb|…|Dec)。这种优化请根据实际情况使用,有时候环视结构开销可能更大。
注:以上几点节选自http://blog.pureisle.net/archives/1447.html,非常好的一篇正则表达式优化文章,推荐有兴趣的朋友看原文。