我正在使用这种 Perl 正则表达式:
/(^.*)XXX/g
我希望这个正则表达式匹配类型的文本
******XXX****XXX***XXX
这样在这种情况下,正则表达式将匹配三次并提供以下结果:
******XXX****XXX***
******XXX****
******
但是,当我将此正则表达式放在这样的列表上下文中时
while($_=~/(^.*)XXX/g)
只有一场比赛
******XXX****XXX***
我哪里错了?
你需要改变你的循环:
$_ = "******XXX****XXX***XXX";
while(/(.*)XXX/) {
print $1,"\n";
$_=$1;
}
匹配的结果在$1
while 您匹配的变量是$_
.
如果您愿意使用$`
( $PREMATCH
),这将获得您想要的结果:
my $inp = "******XXX****XXX***XXX";
while ($inp =~ /XXX/g) {
print $`, "\n";
}
输出:
******
******XXX****
******XXX****XXX***
您的正则表达式失败,因为^.*
贪婪地匹配“一切”。
这是查找所有可能匹配项的方式:
local our @matches;
/^(.*)XXX(?{ push @matches, $1 })(?!)/sg;
say for @matches; # Or whatever
我会这样做:
$str = '******XXX****XXX***XXX';
sub backwards {
if( $_[0] =~ /(.*)XXX.*?$/) {
print $1, "\n";
backwards($1);
}
}
backwards($str);
输出:
******XXX****XXX***
******XXX****
******