Perl正则表达式不匹配字符串操作

时间:2014-07-16 20:24:25

标签: regex 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...

当它

时它不会执行next
PRINT(ABC_XYZ_ERR...
PRINT(ABC_XYZ_WRN...
PRINT(ABC_ERR...

我想将其更改为:

我想对其进行修改,以便除next_ERR

以外的所有内容执行_WRN
PRINT(ABC_XYZ_ERR...
PRINT(ABC_XYZ_WRN...
PRINT(ABC_ERR...

我尝试了以下内容,但它没有匹配任何内容

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

我在不匹配(?!$ERR)运算符中犯了一些错误,但我不知道如何纠正它。我提前感谢您的意见。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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...