昨天看到《高性能的正则表达式效率优化》一文,自己动手试了试。发觉其优化后的正则表达式仍太罗嗦,自己另写~并用RegexBuddy查看匹配流程。其优化后的 正则表达式如下:
^\w+([\.-]\w+)*@\w+([\.-]\w+)*\.\w+([-\.]\w+)*$
该表达式有几个不足之处:
1. 头尾不应该用^$
2. 无须分组,这里用了三个组,若其用于网络爬虫将严重拖慢速度、吞噬内存
3. 没有域名合法性检查
4. @符号前名称判断太罗嗦
5. @符号后二处\w+([.-]\w+)*,明显太累赘
我的正则表达式如下:
\b[\w\.\-]+\b@(?:\b[\w\-]+\.){1,2}[a-zA-Z]{2,3}
测试用文本同前文例子,如图:
点选“Debug”按钮右侧的倒三角,选择“Debug everywhere”,
得到匹配流程分析:
可以看到只有12步,及一个回溯!效率高得多了!!前述五个问题都得到解决。该表达式主要使用\b来匹配一个词的头尾。
几天后,得空又看到这段正则表达式的不足之处,没考虑正则表达式引擎的运行机制:按字符、表达式的顺序执行匹配
最优表达式,在三段域名情形下(admin@open-lib.com.cn)无回溯匹配:
\b[\w\.\-]+\b@\b[\w\-]+\b(?:\.[A-Za-z]{2,3}){1,2}\b
完!快自己动手用RegexBuddy试试吧