Perl正则表达式 - 获取所有匹配项的偏移量而不是一个

5
我想要在文件中搜索字符串并获取所有匹配项的偏移量。 文件内容如下:
sometext
sometext
AAA
sometext
AAA
AAA
sometext

我将整个文件读入一个字符串 $text,然后进行正则表达式匹配,查找 AAA,如下所示:

if($text =~ m/AAA/g) {
    $offset = $-[0];
}

这将只给出一个 AAA 的偏移量。如何获取所有匹配项的偏移量?

我知道我们可以使用如下语法在数组中获取所有匹配项:

my @matches = ($text =~ m/AAA/g);

但我想要匹配字符串的偏移量。

目前,我正在使用以下代码获取所有匹配项的偏移量:

my $text= "sometextAAAsometextAAA";
my $regex = 'AAA';
my @matches = ();

while ($text =~ /($regex)/gi){
    my $match = $1;
    my $length = length($&);
    my $pos = length($`);
    my $start = $pos + 1;
    my $end = $pos + $length;
    my $hitpos = "$start-$end";
    push @matches, "$match found at $hitpos ";
}

print "$_\n" foreach @matches;

但是有没有更简单的方法实现这个功能呢?
2个回答

3
你已经知道应该使用$-[0]了!请进行更换。
while ($text =~ /($regex)/gi){
    my $match = $1;
    my $length = length($&);
    my $pos = length($`);
    my $start = $pos + 1;
    my $end = $pos + $length;
    my $hitpos = "$start-$end";
    push @matches, "$match found at $hitpos ";
}

使用

while ($text =~ /($regex)/gi){
    push @matches, "$1 found at $-[0]";
}

说到这里,我非常支持把计算与输出格式分离,所以我会这样做:
while ($text =~ /($regex)/gi){
    push @matches, [ $1, $-[0] ];
}

PS — 除非您取消了 while 循环,if (/.../g) 没有意义。在最好的情况下,/g 不起作用。在最坏的情况下,您会得到错误的结果。


2

我认为 Perl 中没有内置的方法可以做到这一点。但是从 “如何在 Perl 中查找正则表达式匹配位置?”中可以得到以下信息:

sub match_all_positions {
    my ($regex, $string) = @_;
    my @ret;
    while ($string =~ /$regex/g) {
        push @ret, [ $-[0], $+[0] ];
    }
    return @ret
}

但是这只返回最后一个匹配的位置。 - Genom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接