我正在阅读一个文件,并试图打印两个由析取分隔的正则表达式的匹配。如何在保持分离的同时打印出两个匹配?
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
答案 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";
}