我有以下代码
$str = "
OTNPKT0553 04-02-03 21:43:46
M X DENY
PLNA
/*Privilege, Login Not Active*/
;";
$val = $str =~ /[
]*([\n]?[\n]+
[\n]?) ([^;^
]+)/s;
print "$1 and $2";
输出
and PLNA
为什么将PLNA
作为输出。我认为应该先停止\n
。我假设输出应为OTNPKT0553 04-02-03 21:43:46
答案 0 :(得分:3)
你的正则表达式很乱,包含很多冗余。以下步骤演示了如何简化它,然后更清楚地说明为什么匹配PLNA
。
1)翻译你的正则表达式中的文字新行:
$val = $str =~ /[\n\n]*([\n]?[\n]+\n[\n]?) ([^;^\n]+)/s;
2)然后简化此代码以删除冗余:
$val = $str =~ /(\n{2}) ([^;^\n]+)/s;
基本上,正则表达式正在寻找两个新行,然后是3个空格。
OTNPKT0553
之前有三个空格,但只有一个新行,所以它不匹配。
接下来的三个空格位于PLNA
之前,其前面有两个新行,因此匹配。
答案 1 :(得分:2)
你有很多新行 - 有些是字面的,有些是\n
。我不清楚你是怎么想的。您认为\n
与号匹配吗? \d
匹配数字,并且还匹配许多其他语言中的数字的Unicode字符。但是对于简单的ASCII文本,它可以正常工作。
你需要的是这样的东西
use strict;
use warnings;
my $str = "
OTNPKT0553 04-02-03 21:43:46
M X DENY
PLNA
/*Privilege, Login Not Active*/
;";
my $val = $str =~ / (\w+) \s+ ( [\d-]+ \s [\d:]+ ) /x;
print "$1 and $2";
<强>输出强>
OTNPKT0553 and 04-02-03 21:43:46
答案 2 :(得分:1)
您有额外的换行符,请将正则表达式更改为:
$str =~ /[
]*([\n]?[\n]+[\n]?) ([^;^
]+)/s;
更简单:
$str =~ /\n+ ([^;^\n]+)/s;