+ -
当前位置:首页 → 问答吧 → perl 正则表达式问题

perl 正则表达式问题

时间:2010-11-17

来源:互联网

本帖最后由 cduedu 于 2010-11-17 17:29 编辑

实例内容:
  1. [15/Nov/2010:21:16:41 +0100] - OPERATION  - INFO  - conn=1477577 op=2 UNBIND test
  2. [15/Nov/2010:21:16:41 +0100] - OPERATION  - INFO  - conn=1477577 op=2 UNBIND
  3. [15/Nov/2010:21:16:41 +0100] - DISCONNECT - INFO  - conn=1477577 reason="unbind" msg="test"
  4. [15/Nov/2010:21:16:41 +0100] - DISCONNECT - INFO  - conn=1477577 reason="close by client" msg="test"
复制代码
假设:reason可能包括一些字母、数字、空格等内容
目的:把reason="xxxx"和msg="xxxx"的内容取出来。在用下面的代码匹配的时候老是有问题
  1. if ($_ =~ /reason=*\"(.*)\"/i) { $reason=$1;}
  2. if ($_ =~ /msg=*\"(.*)\"/i) { $dmsg=$1;}
复制代码
perl在匹配reason的时候把属于msg的内容也取出来了。

结果:
unbind" msg="test
unbind" msg="test

有没有办法perl只取到两个引号间的内容而不是后面的也包括在里面。

暂时来看
  1. if ($_ =~ /reason=\"([a-zA-Z ]+)\"/i)
复制代码
没什么问题,但这个办法感觉不太好,大家有没有简单点有效的办法

作者: cduedu   发布时间: 2010-11-17

  1. if ($_ =~ /reason=*\"(.*?)\"/i) { $reason=$1;}
  2. if ($_ =~ /msg=*\"(.*?)\"/i) { $dmsg=$1;}
复制代码
......

作者: fanasy   发布时间: 2010-11-17

本帖最后由 jason680 于 2010-11-17 17:54 编辑


QUOTE:
实例内容:假设:reason可能包括一些字母、数字、空格等内容
目的:把reason="xxxx"和msg="xxxx"的内容取出 ...
cduedu 发表于 2010-11-17 17:27

  1. $reason=$1 if(m/reason="([^"]+)"/);
  2. $dmsg=$1 if(m/msg="([^"]+)"/);
复制代码
如果msg一定接在reason后面,可以这样
  1. if(m/reason="([^"]+)"\s+msg="([^"]+)"/){
  2.     ($reason, $dmsg) = ($1, $2);
  3. }
复制代码
注:少用(别用) .*或.*? ,在你没完全了解* 为0 到多个,中的0(零)个真正义前,不要用它...

作者: jason680   发布时间: 2010-11-17

二楼的好

作者: blacktt   发布时间: 2010-11-17