正则表达式替换表达式中的当前位置

时间:2015-10-28 15:51:24

标签: regex perl

在带有替换表达式(/e修饰符)的Perl正则表达式中,我试图找到当前匹配的位置。 pos函数似乎就是我的意思。以下代码

my $string = "Hello world!";
$string =~ s/world/"$& (found at " . pos($string) . ")"/ge;
print "$string\n";

打印

Hello world (found at 6)!

但我无法找到文档中指定的位置。 documentation of pos仅表示它返回"最后m//g次搜索停止的位置的偏移量"。所以我不确定我是否可以依赖这种行为。

问题:pos的这种用法是否在任何地方都有记录?我可以依赖pos在不同的Perl版本下使用这种方式吗?有没有更好的方法来获得当前比赛的位置?

1 个答案:

答案 0 :(得分:2)

您可以使用@-@+变量来确定每个捕获组的开始/结束位置以及整个匹配。

  • @-[0]将包含整个模式的 start 位置。在您的示例中,它将是6

  • @+[0]将包含整个模式的 end 位置。在您的示例中,它将是11

以下是$-[0]的示例:

my $string = "Hello world!";
$string =~ s/world/"$& (found at " . $-[0] . ")"/ge;
print "$string\n";

打印

  

Hello world(6点发现)!