免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7168 | 回复: 12
打印 上一主题 下一主题

如何优化正则表达式的性能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-06 14:43 |只看该作者 |倒序浏览
在一个脚本中,有类似的匹配语句:

while(<>)
{
&nbsp;&nbsp;if(/...(..)../){ xxx $1xxx  }
&nbsp;&nbsp;if(/...(..)../){xxx$1xxxx}
&nbsp;&nbsp;if (/........(..)../){xxxx$1xxx}
}


之所以分成好多个if, 是因为这些匹配出现的顺序是不同的,不能写在一个正则里面。
因此效率很低(待处理文件有数百G)

请问如何能提高这部分的效率呢?
我试过这样写:
if(/xxxx/ || /xxxxx/ || /xxxxx/) {}
但是$1的取值不正常。

论坛徽章:
0
2 [报告]
发表于 2007-08-06 15:59 |只看该作者
..... 和xxxx 到底是啥
看不懂

论坛徽章:
0
3 [报告]
发表于 2007-08-06 16:15 |只看该作者
是有点看天书的感觉,楼主把你的源数据稍微修改一下给出来一部分吧

论坛徽章:
0
4 [报告]
发表于 2007-08-06 22:58 |只看该作者
汗,重新写一下:
源数据:


脚本:
while(<>)
{
  if (/a=([^&]*)/) {print $1;}
  if (/b=([^&]*)/) {print $1;}
  if (/c=([^&]*)/) {print $1;}
}

脚本分成三次if,是因为源数据a,b,c 的顺序随机。
但是效率较低,如何提高效率呢?
正则表达式可以实现不关心顺序么?

[ 本帖最后由 philonis 于 2007-8-6 23:00 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-08-06 23:15 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2007-08-06 23:57 |只看该作者
原帖由 zhuomingliang 于 2007-8-6 23:15 发表
http://bbs.chinaunix.net/viewthread.php?tid=690804&page=1

抱歉可能我没表达清楚,我不是要处理url
而是一个文本文件,只是这个文本的内容是url而已,也可以想象成别的任何内容。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-08-07 07:02 |只看该作者
内容是 URI,那便用 URI 来处理好了,这有什么好想的。
如果非要用正则表达式的话,
可以用
while( $str =~ /(a|b|c)=([^&]*)/g ){
    print "$1 $2\n";
}
这样子。

论坛徽章:
0
8 [报告]
发表于 2007-08-07 12:54 |只看该作者
原帖由 flw 于 2007-8-7 07:02 发表
内容是 URI,那便用 URI 来处理好了,这有什么好想的。
如果非要用正则表达式的话,
可以用
while( $str =~ /(a|b|c)=([^&]*)/g ){
    print "$1 $2\n";
}
这样子。


这段代码当 a 匹配成功后,就会跳到下一行了,a b c 都存在的时候处理不了。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-08-07 13:03 |只看该作者
原帖由 philonis 于 2007-8-7 12:54 发表

这段代码当 a 匹配成功后,就会跳到下一行了,a b c 都存在的时候处理不了。。

搭救都搭救不到人世上。

论坛徽章:
0
10 [报告]
发表于 2007-08-07 13:30 |只看该作者
原帖由 flw 于 2007-8-7 13:03 发表

搭救都搭救不到人世上。


。。。。看来我是说不清楚了,我的原始文本是混合了各种格式的apache日志,明白了吧,不可能用什么URI,除非先用正则把url提取出来,但是每天日志有500G,需要快速处理完,引用模块太慢,而且没有合适的。

不用再回这个帖子了

[ 本帖最后由 philonis 于 2007-8-7 13:34 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP