首先看代码plz~
这是perl代码。
my $st = 'aaaa';
while ( $st =~ /aa/g ) {
print $&, "\n";
}
我想移动字符串中的一个点。
所以我想要三个aa
的结果。
但是,只获得了两个结果。
我可以得出三个结果吗?
答案 0 :(得分:1)
my $st = 'aaaa';
my $find = 'aa';
while($st =~ /$find/g){
print $&,"\n";
pos($st) -= (length($find)-1);
}
返回最后一个m // g搜索为相关变量留下的偏移量(当未指定变量时使用$ _)
同样pos()
为lvalue subroutine,其结果可以像变量一样进行更改。
答案 1 :(得分:1)
使用前瞻。它没有推进这个职位:
my $st = 'abcd';
while ($st =~ /(?=(..))/g) {
print "$1\n";
}
我使用了不同的字符串来使匹配的位置可见。
答案 2 :(得分:1)
以下将解决这个问题:
while ($st =~ /(?=(aa))/g) {
print "$1\n";
}
答案 3 :(得分:0)
您的问题是正则表达式通常不允许重叠匹配。
您可以通过为当前两场比赛输出Positional Information来探索这一事实:
my $st = 'aaaa';
while ( $st =~ /aa/g ) {
print "pos $-[0] - $&\n";
}
输出:
pos 0 - aa
pos 2 - aa
要解决此问题,您只需使用Positive Lookahead Assertion和明确的capture group:
while ( $st =~ /(?=(aa))/g ) {
print "pos $-[0] - $1\n";
}
输出:
pos 0 - aa
pos 1 - aa
pos 2 - aa