使用正则表达式获取重叠匹配

时间:2014-09-11 15:11:40

标签: perl

首先看代码plz~

这是perl代码。

my $st = 'aaaa';

while ( $st =~ /aa/g ) {
    print $&, "\n";
}

我想移动字符串中的一个点。

所以我想要三个aa的结果。

但是,只获得了两个结果。

我可以得出三个结果吗?

4 个答案:

答案 0 :(得分:1)

my $st = 'aaaa';
my $find = 'aa';

while($st =~ /$find/g){
    print $&,"\n";
    pos($st) -= (length($find)-1);
}

来自perldoc pos

  

返回最后一个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