2009-05-20 124 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類。

相關問題