Perl Regex - 在MATCH的情况下获取行号而不是字符位置

时间:2012-07-10 09:07:23

标签: regex perl offset

我正在读取字符串中的完整文件,然后进行正则表达式匹配,如下所示:

if($str =~ m/$regex/gc) {
     $offset = $+[0];
}

使用此代码,我可以捕获上次成功匹配结束的位置。

现在这将把位置作为字符编号。

有什么方法可以作为行号偏移?

我现在要做的是,我计算从$str到结束$offset开头的换行符数。

我想知道有没有直接的方法来捕获正则表达式匹配的行号。

2 个答案:

答案 0 :(得分:4)

与人们可能想象的相反,在这种情况下使用Nahuel's suggestion$.实际上是可行的。

这是因为人们可以像使用Perl的文件一样读取字符串:

use strict;
use warnings;

my $str = <<EOS;
spam
spam
spam
match
spam
match
EOS

open my $handle, '<', \$str or die $!;

while ( <$handle> ) {

    print $., "\n" if /match/;
}

<强>输出

4
6

答案 1 :(得分:1)

参见perldoc perlvar,特殊变量$.

编辑:评论后,抱歉,我读的太快了

另一种解决方案,如果有很多匹配,可以创建一个包含新行偏移的数组:$ a [0] - &gt;线2的偏移等等接近线数,最后增加或减少以找到线。 如果最后一行不包含换行符,则可能会出现问题。

# create an array with offset of new lines
@a=(0,0);push@a,$-[0]while$str=~/\n/gc;

if($str =~ m/$regex/gc) {
  $offset = $+[0]; 
  # get an approximation of line
  $l=int$offset*@a/$a[-1];
  # increment or decrement
  $l++while$a[$l+1]<$offset;
  $l--while$a[$l]>$offset;
}

编辑: 未经测试, 更改初始化@ a =(0,0)以避免最后的+2,如果匹配第一行则安全 $升++而$一个[$ L + 1] $偏移 和* @添加