为什么在此正则表达式中匹配空行?

时间:2009-05-20 10:31:07

标签: regex perl

天儿真好,

我使用以下Perl片段从Solaris集群命令中提取输出。

open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]+/,<CL>;
close(CL);

当我打印数组元素的内容时,我得到以下内容@clrg BTW“=&gt;”和“&lt; =”行分隔符由我的print语句插入:

=><=
=>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=><=
=>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=><=

当我用以下Perl片段替换它时,空行不匹配。

open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]{3,}/,<CL>;
close(CL);

我得到以下内容:

=>nas-rg             mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=
=>apache-rg          mcs0.cwwtf.bbc.co.uk   No          Online<=
=>                   mcs1.cwwtf.bbc.co.uk   No          Offline<=

简单的问题是为什么?

BTW在第二个Perl片段中使用{1,}也匹配空行!

感激不尽的任何建议!

欢呼声,

2 个答案:

答案 0 :(得分:9)

那将是因为[:space:]也匹配换行符和回车符。

所以[[:space:]]+会匹配\n\r\n\n\n

[[:space:]]{3,}需要三个字符,空行只需\n

{1,}+表示相同的事情:将前一组匹配一次或多次。

P.S。典型的换行符是Unix上的\n和Windows上的\r\n

答案 1 :(得分:1)

嗯。根据{{​​3}},[:space:]字符类不应包含换行符,因为它应该等同于\s(除了它识别另一个字符,vertical-tab,以维护POSIX合规性。)

然而,刚刚在5.10.0上测试了这个,我可以验证它是否也匹配换行符。无论这是否属于Perl或文档中的错误,我都将留给Perl维护者。但要避免直接问题,请使用之前的回答者解决方案,只使用\s而不是POSIX类。