即使可能进行多次匹配,Perl正则表达式也只返回列表上下文中的一个值

时间:2013-01-30 09:13:48

标签: regex perl

我正在使用这种perl正则表达式:

/(^.*)XXX/g

我希望此正则表达式匹配

类型的文本
******XXX****XXX***XXX

这样在这种情况下,正则表达式将匹配3次并提供以下结果:

******XXX****XXX***
******XXX****
******

然而,当我把这个正则表达式放在像这样的列表上下文中时

while($_=~/(^.*)XXX/g)

只有一场比赛,而且是

******XXX****XXX***

我哪里错了?

4 个答案:

答案 0 :(得分:6)

您需要更改循环:

$_ = "******XXX****XXX***XXX";
while(/(.*)XXX/) {
    print $1,"\n";
    $_=$1;
}

匹配的结果位于$1,而您匹配的变量为$_

答案 1 :(得分:2)

如果您愿意使用$ $ PREMATCH`,这将获得您想要的结果:

my $inp = "******XXX****XXX***XXX";
while ($inp =~ /XXX/g) {
  print $`, "\n";
}

输出:

******
******XXX****
******XXX****XXX***

你的正则表达式失败了,因为^.*贪婪地匹配'一切'。

答案 2 :(得分:1)

我会这样做:

$str = '******XXX****XXX***XXX';

sub backwards {
    if( $_[0] =~ /(.*)XXX.*?$/) {
        print $1, "\n";
        backwards($1);
    }
}

backwards($str);

输出:

******XXX****XXX***
******XXX****
******

答案 3 :(得分:1)

这是找到所有可能匹配的方式:

local our @matches;
/^(.*)XXX(?{ push @matches, $1 })(?!)/sg;
say for @matches;  # Or whatever