2009-05-20 80 views
1

G'day,为什么在这个正则表达式中匹配空行?

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

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

我碰到下面当我打印的数组元素的BTW @clrg“=>”和“< =”行分隔符是由我打印语句插入内容:

=><= 
=>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<= 

简单的问题是,为什么?

顺便说一句在第二个Perl片段中使用{1,}还匹配空白行!

任何建议感激地收到!

欢呼声,

回答

9

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

因此[[:space:]]+将匹配\n\r\n\n\n

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

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

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

+1

@Andomar,这些POSIX角色类不能单独存在;它们必须在另一对方括号内使用,即[[:space:]]。 – 2009-05-20 12:59:04

+0

谢谢,已在问题中更正 – Andomar 2009-05-20 13:16:44

1

嗯。根据Perl regular expression documentation[:space:]字符类不应包含换行符,因为它应该等于\s(除了识别一个附加字符,垂直标签以维护POSIX合规性)。

但是,刚刚在5.10.0上测试了这个,我可以验证它是否匹配换行符。无论这是否符合Perl或文档中的错误,我都会去找Perl维护人员。但为避免直接的问题,请使用先前的答案解决方案,并使用\s而不是POSIX类。

相关问题