免费注册 查看新帖 |

Chinaunix

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

[正则表达式]请教分组捕获中的特殊情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-27 11:41 |只看该作者 |倒序浏览
文本内容:log1

2014-02-12T01:03:24.599Z cpu28:42479)NMP: nmp_ThrottleLogForDevice:2321: Cmd 0x85 (0x4130801e1940, 34849) to dev

"naa.600508b1001cc026e1ee67e9f99d273b" on path "vmhba0:C0:T0:L1" Failed: H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0. Act:NONE
2014-02-12T01:03:24.599Z cpu28:42479)ScsiDeviceIO: 2337: Cmd(0x4130801e1940) 0x85, CmdSN 0xf96 from world 34849 to dev

"naa.600508b1001cc026e1ee67e9f99d273b" failed H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.
2014-02-12T01:03:24.610Z cpu31:52002)ScsiDeviceIO: 2337: Cmd(0x4130801e1940) 0x4d, CmdSN 0xf97 from world 34849 to dev

"naa.600508b1001cc026e1ee67e9f99d273b" failed H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.

cat log1 | perl -ne 's/\r//g;print "$1 $2 $3 $4 $5 \n" if /(^.*?.*(Cmd.*?\)).*(naa\.\w+).*(vmhba.*?L).*(H:.*\.)/'              
2014-02-12T01: Cmd 0x85 (0x4130801e1940, 34849) naa.600508b1001cc026e1ee67e9f99d273b vmhba0:C0:T0:L H:0x0 D:0x2 P:0x0 Valid sense data:

0x5 0x20 0x0.
需要匹配5个字段,其中包括vmhba的 记录,结果是输出第一行匹配后的内容,其他没有包含hba的记录都没有匹配成功。

cat log1 | perl -ne 's/\r//g;print "$1 $2 $3 $4 $5 \n" if /(^.*?.*(Cmd.*?\)).*(naa\.\w+).*(H:.*\.)/'              
2014-02-12T01: Cmd 0x85 (0x4130801e1940, 34849) naa.600508b1001cc026e1ee67e9f99d273b H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.  
2014-02-12T01: Cmd(0x4130801e1940) naa.600508b1001cc026e1ee67e9f99d273b H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.  
2014-02-12T01: Cmd(0x4130801e1940) naa.600508b1001cc026e1ee67e9f99d273b H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.  
需要匹配4个字段,但是去掉了匹配vmhba的表达式,输出了所有记录。




cat log1 | perl -ne 's/\r//g;print "$1 $2 $3 $4 $5 \n" if /(^.*?.*(Cmd.*?\)).*(naa\.\w+).*((?:vmhba.*?L){0,1}).*(H:.*\.)/'  
2014-02-12T01: Cmd 0x85 (0x4130801e1940, 34849) naa.600508b1001cc026e1ee67e9f99d273b  H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.
2014-02-12T01: Cmd(0x4130801e1940) naa.600508b1001cc026e1ee67e9f99d273b  H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.
2014-02-12T01: Cmd(0x4130801e1940) naa.600508b1001cc026e1ee67e9f99d273b  H:0x0 D:0x2 P:0x0 Valid sense data: 0x5 0x20 0x0.
使用非捕获分组后对分组匹配一次,实际上和第一个一样,应该是匹配了0之后就结束了?

如果把{n,m}改成?号,实际上只按0次匹配,和{0,1}是一样的吧。。。

请问有没有什么办法让这个正则先匹配vmhba.*?L一次,如果成功那么返回改分组变量;如果没有匹配到vmhba.*?L,那么匹配0次。
这个好像是一个类似{1,0}的概念,但是n必须小于等于m。

除了用条件语句对记录分别进行处理,还有没有只用正则表达式解决的方法呢?

附加问题:$1 $2 $3..有没有哪个默认数组保存这几个记录的?

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2014-04-27 18:55 |只看该作者
LZ  你说了这么多 ... 我没看懂你要表达什么意思

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
3 [报告]
发表于 2014-04-27 21:50 |只看该作者
.*  太贪婪,本来能匹配一个,但想匹配更多,结果两手空空,什么也没得到。

论坛徽章:
0
4 [报告]
发表于 2014-04-28 22:15 |只看该作者
回复 2# mcshell


     好像是没表达清楚,简化一下:


ABCD
ABD
ABD

我现在想做到的是只用一个正则通过捕获,获取ABCD到变量中,如果没有C的话获取ABD!

我的表达式是 (A)(B)(C)(D),
这样就只能获取ABCD都同时存在的记录,包含C的记录被忽略了;

如果用(A)(B)((?:C)?)(D),这时候正则会先按照0次匹配记录C处理,只能获取到ABD的记录。

有办法实现吗?

非常感谢!

附加问题是,ABCD获取后存到 变量$1$2$3$4中,有没有默认的数组存储这几个变量呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2014-04-29 15:07 |只看该作者
本帖最后由 jason680 于 2014-04-29 15:14 编辑

回复 4# beacon1024

$ perl Re.pl
matched A,B,C,D
matched A,B,,D
didn't match:ABC

$ cat Re.pl

use strict;
use warnings;

while(<DATA>){
  if(my @aMatch = m/(A)(B)((?:C)?)(D)/){
    print "matched ", join(",",@aMatch) , "\n";
  }else{
    print "didn't match:$_";
  }

}
__DATA__
ABCD
ABD
ABC

论坛徽章:
0
6 [报告]
发表于 2014-05-01 06:48 |只看该作者
回复 5# jason680


    好像我过于简化了,数据中间实际上是有很多其他字符的,不只是ABCD,如下:

cat data
.....A.....B.....C......D...
.....A.....B...........D...
.....A.....B...........D...

$cat data | perl -ne 'print "$1 $2 $3 $4 \n" if /(A).*(B).*(C)?.*(D).*/'
A B  D
A B  D
A B  D

$cat data | perl -ne 'print "$1 $2 $3 $4 \n" if /(A).*(B).*(C).*(D).*/'     
A B C D


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP