正则表达式在Perl中不匹配

时间:2015-10-04 02:29:02

标签: regex perl

我正在阅读一个文件,并试图打印两个由析取分隔的正则表达式的匹配。如何在保持分离的同时打印出两个匹配?

open(my $fh, $ARGV[0]) or die "ARGV[0] not found!\n";

while(my $line = <$fh>){
    if ($line =~ /(NNPS\S+)|(DT\S+ JJ\S+ JJ\S+ NN\S+)/){
        print $line, "\n", $1,  "\n", $2
    }
}

输入将是:

NNPS/Helicopters MD/will NN/patrol DT/the JJ/temporary JJ/no-fly NN/zone IN/around NNP/New NNP/Jersey POS/'s

输出将是:

Line 1
NNPS/Helicopters
DT/the JJ/temporary JJ/no-fly NN/zone

2 个答案:

答案 0 :(得分:1)

你的正则表达式永远不会在单个匹配中匹配|的两边,这就是为什么它是一个或者。您应该使用/g匹配以获得所有可能的匹配,只使用一个捕获组,并将其收集到列表中。

if (my @matches = $line =~ /(NNPS\S+|DT\S+ JJ\S+ JJ\S+ NN\S+)/g){
    print join "\n", @matches;
}

答案 1 :(得分:1)

“离婚”在灭亡谈话中被称为交替。 给出:

"abc123" =~ m/(abc|123)/;

print $1; # abc

试试这个(注意全局搜索修饰符 \ g ):

while ("abc123" =~ m/(abc|123)/g){
   print "$1\n";
}