2014-07-16 94 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

谢谢你的解决方案。虽然它起作用,但我想知道只是为了学习目的而使用不匹配运算符的正确方法。你能告诉我怎么做,而不使用,除非? –