在perl中匹配regexp的问题

时间:2014-08-06 13:54:23

标签: perl

我有以下代码

$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

3 个答案:

答案 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;