Perl的正则表达式 - 让所有的比赛,而不是一个偏移(Perl Regex - Get offse

2019-09-19 08:58发布

我要搜索一个文件的字符串,然后得到补偿的所有比赛。 文件的内容如下:

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;

但有对这一简单的方法?

Answer 1:

我不认为有一个内置的方式在Perl做到这一点。 但我怎么能找到Perl的正则表达式匹配的位置? :

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


Answer 2:

你已经知道,你应该使用$-[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什么都不做。 在糟糕的是,你会得到不正确的结果。



文章来源: Perl Regex - Get offset of all the matches instead of one