我想在文件中搜索字符串,然后获取所有匹配的偏移量。 文件内容如下:
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;
但有更简单的方法吗?
答案 0 :(得分: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
什么都不做。更糟糕的是,你得到的结果不正确。
答案 1 :(得分:2)
我认为在Perl中没有内置的方法可以做到这一点。但是从How can I find the location of a regex match in Perl?:
sub match_all_positions {
my ($regex, $string) = @_;
my @ret;
while ($string =~ /$regex/g) {
push @ret, [ $-[0], $+[0] ];
}
return @ret
}