perl语言正则表达式的巧妙使用使用

在学习脚本语言perl的时候,觉得最有"意思"的还是 它的正则表达式功能,它的功能非常强大,在C++等语言要n行代码完成的事情,它只要一行就可以实现,比如:

$line =~ s//'//'/'/g;这个就可以将$line中所有的'替换为'',如果用c++来做,常规思路肯定要作循环来替换。

如果碰到较复杂的正则表达式,则要从多方位去思考匹配的方法,有时候可以在第一次分割完成后再作处理;这样会有更好的效果,现举一个例子,开源项目awstatas是对apache log做处理的“性价比”非常高的项目,用perl语言开发的,;在项目中定义了logformat的正则表达式如下:

$PerlParsingFormat="([^ ]+) [^ ]+ ([^//[]+) //[([^ ]+) [^ ]+//] ///"([^ ]+) ([^ ]+) [^///"]+///" ([//d|-]+) ([//d|-]+) ///"(.*?)///" ///"([^///"]*)///"";

处理的log格式如下:

192.168.1.11- - [08/Jan/2008:00:00:02 +0000] "GET /test/test.php?name=test HTTP/1.1" 200 6 "-" "-"

如果apache配置文件改动LogFormat参数,支持多级代理(将%h改为%X-Forwarded-For)则其log变成如下格式:

192.168.1.11, 192.168.1.12, 192.168.1.13, 192.168.1.10 - - [08/Jan/2008:00:00:02 +0000] "GET /test/test.php?name=test HTTP/1.1" 200 6 "-" "-"

这时候我们再用同样的正则表达式就会得到不是我们想要的内容,$2则会变为 192.168.1.13, 192.168.1.10 - -,而不是"-",我们考察正则表达式时候发现他是用空格作为$1的分割符,如果我们这时将$1改动为.*或.+这就会将192.168.1.11, 192.168.1.12, 192.168.1.13, 192.168.1.10一次全部获得,然后我们再取得第一个非unkonwn的字符串这就得到我们想要的内容,在这个时候如果我们还用空格作分割符,则很难再得到我们想要的内容,我们从正则表达式整体考虑,采用“正难则反”,“二级分割”的原则,则可以巧妙的解决问题。

补记:使用的过程中,如果用这样的方法做模式匹配,在性能上会有所下降,如果是每次处理都要作这样的模式匹配,效率会下降原来的1/4,这如果对于大数据量处理来说是一个很大的问题,在作脚本的时候要注意到这点。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值