2014-07-16 88 views
1

我到目前爲止有:Perl的正則表達式不匹配,字符串操作

這裏是我創建

if (/PRINT\((\s*\n*\t*)[A-Z]+_[A-Z]*(_*)(DBG|NOT|UNC)/ ) { next; } 

正則表達式目前,它執行next當它檢測到

PRINT(ABC_XYZ_DBG... 
PRINT(ABC_XYZ_NOT... 
PRINT(ABC_UNC... 

當它是

時它不執行
PRINT(ABC_XYZ_ERR... 
PRINT(ABC_XYZ_WRN... 
PRINT(ABC_ERR... 

我想將它更改爲:

我想修改它,所以它會比_ERR_WRN

PRINT(ABC_XYZ_ERR... 
PRINT(ABC_XYZ_WRN... 
PRINT(ABC_ERR... 

其他一切執行next我嘗試以下,但它沒」 t什麼都可以匹配

 my $ERR = qr/ERR/; 
     my $WRN = qr/WRN/; 
if (/PRINT\((\s*\n*\t*)[A-Z]+_[A-Z]*(_*)(?!$ERR|$WRN)/ ) { next; } 

我是mak在不匹配的(?!$ERR)運營商中出現了一些錯誤,但我不知道如何糾正它。我很欣賞你的投入。

+0

這與Python有什麼關係? – Barmar

+0

對不起,我認爲Python和Perl之間的正則表達式是很常見的。如果不是,我很抱歉。 –

+0

這些日子大多數流行語言都很常見。 – Barmar

回答

1

可以匹配(ERR|WRN)而不是(DBG|NOT|UNC),然後用!否定它。

您可以使用\s*而不是\s*\t*\n*,因爲\s匹配任何空格。

if (! /PRINT\((\s*)[A-Z]+_[A-Z]*(_*)(ERR|WRN)/) { next; } 

輸入:

PRINT(ABC_XYZ_DBG... 
PRINT(ABC_XYZ_NOT... 
PRINT(ABC_UNC... 
PRINT(ABC_XYZ_ERR... 
PRINT(ABC_XYZ_WRN... 
PRINT(ABC_ERR... 

一襯墊:

perl -nle 'if (! /PRINT\((\s*)[A-Z]+_[A-Z]*(_*)(ERR|WRN)/ ) { next; } print' input.txt 

輸出:

PRINT(ABC_XYZ_ERR... 
PRINT(ABC_XYZ_WRN... 
PRINT(ABC_ERR... 
1
next unless (/PRINT\((\s*\n*\t*)[A-Z]+_[A-Z]*(_*)(ERR|WRN)/); 
+1

如何添加一點解釋? –

+0

我不確定是否真的有必要。它只是否定符合ERR和WRN模式的條件。 – konsolebox

+0

謝謝你的解決方案。雖然它起作用,但我想知道只是爲了學習目的而使用不匹配運算符的正確方法。你能告訴我怎麼做,而不使用,除非? –