4

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

/(^.*)XXX/g

我希望这个正则表达式匹配类型的文本

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

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

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

但是,当我将此正则表达式放在这样的列表上下文中时

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

只有一场比赛

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

我哪里错了?

4

4 回答 4

6

你需要改变你的循环:

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

匹配的结果在$1while 您匹配的变量是$_.

于 2013-01-30T09:29:46.230 回答
2

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

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

输出:

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

您的正则表达式失败,因为^.*贪婪地匹配“一切”。

于 2013-01-30T09:31:51.467 回答
1

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

local our @matches;
/^(.*)XXX(?{ push @matches, $1 })(?!)/sg;
say for @matches;  # Or whatever
于 2013-01-30T12:10:57.007 回答
0

我会这样做:

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

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

backwards($str);

输出:

******XXX****XXX***
******XXX****
******
于 2013-01-30T09:38:03.750 回答