【分享】正则表达式的效率——不同的写法,效率差的远比想象的多

varlj 2008-11-01 04:24:21
昨天晚上看《深入浅出正则表达式》,看到对于正则式效率一节,好奇测试了一下。
平时写正则式,只求能达到目的就好了,从来没想过效率这问题(顶多就是不需要的分组不捕获),昨天一测试,吓我一跳
用一下里面的例子,写一个正则式,检测的字串中的每个字段间用逗号做分隔符,第12个字段由P开头
1,2,3,4,5,6,7,8,9,10,11,12,13

写法一 匹配次数
(.*?,){11}p 120628次
^(.*?,){11}p 60400次
(\w*?,){11}p 1485次
^(\w*?,){11}p 170次
^([^,\r\n]*,){11}P 133次

注:正则式不是很准确,只是为了说明效率问题

解决方案:
一种简单的方案是尽可能的使匹配精确。用取反字符集代替点号。例如我们用如下正则表达式^([^,\r\n]*,){11}P,这样可以使失败回溯的次数下降到11次。

另一种方案是使用原子组。(测试了一下,JS不支持,C#和JAVA是支持的)

原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是(?>正则表达式)。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成^(?>(.*?,){11})P。一旦第十二个字段匹配失败,引擎回溯到原子组前面的^。
...全文
370 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiqicai2 2011-02-16
  • 打赏
  • 举报
回复
这个问题的关键在于匹配的是十一个逗号,如果换成一两个,区别就不会这么明显了.
而且在一般的应用里面,不会出现匹配这么多重复的字符的例子吧.
btbtd 2008-11-01
  • 打赏
  • 举报
回复
应该劫劫三楼那家伙...
2008-11-01
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回帖即可获得 10 分可用分!
wtcsy 2008-11-01
  • 打赏
  • 举报
回复
mark
jf.......
王集鹄 2008-11-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinmo 的回复:]
抢劫大财主啊
[/Quote][img=http://p.blog.csdn.net/images/p_blog_csdn_net/zswangii/%E6%89%AB%E5%B0%84.gif]图[/img]
  • 打赏
  • 举报
回复
抢劫大财主啊
王集鹄 2008-11-01
  • 打赏
  • 举报
回复
如果要处理字符串很长是应该好好设计一下。[img=http://p.blog.csdn.net/images/p_blog_csdn_net/zswang/%E5%90%8C%E6%84%8F.gif]图[/img]

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧