我正在使用这种perl正则表达式:
/(^.*)XXX/g
我希望此正则表达式匹配
类型的文本******XXX****XXX***XXX
这样在这种情况下,正则表达式将匹配3次并提供以下结果:
******XXX****XXX***
******XXX****
******
然而,当我把这个正则表达式放在像这样的列表上下文中时
while($_=~/(^.*)XXX/g)
只有一场比赛,而且是
******XXX****XXX***
我哪里错了?
答案 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