是否有更新匹配计数器,我可以在替换文本中用作前缀?

时间:2015-08-29 15:06:18

标签: regex perl

在perl正则表达式中,是否有更新匹配计数器,我可以将其用作替换文本中的前缀?例如,我想将position的每个匹配项替换为position 1position 2等等。

3 个答案:

答案 0 :(得分:3)

不,没有预定义的计数器,但您可以自己轻松创建一个:

/e

(使用{{1}}标志告诉perl将替换部分解析为代码块,而不是字符串。)

答案 1 :(得分:3)

制作自己的专柜。在替换的替换侧声明state并为每次替换增加它。除了变量的范围外,这与其他答案类似:

use v5.10;

my $string  = 'position position position';

$string =~ s{position}{
    state $i = 0;
    $i++;
    "POS $i"
    }ge;

say $string;

捕获变量可用,因此您可以使用$1$&等等:

use v5.10;

my $string  = 'position position position';

$string =~ s{position}{
    state $i = 0;
    $i++;
    "$& $i"
    }ge;

say $string;

但是,由于state需要v5.10,因此您可以使用/p开关和${^MATCH}变量(每个匹配而非{{1}的全局版本}):

$&

而且,你可以在替代方面做更好的事情:

use v5.10;

my $string  = 'position position position';

$string =~ s{position}{
    state $i = 0;
    $i++;
    "${^MATCH} $i"
    }gpe;

say $string;

答案 2 :(得分:1)

这样的事应该做​​: $ perl -e '$string = "position position position"; $i=1; $string =~ s/(position)/"$1 " . $i++/ge; print $string' position 1 position 2 position 3

这里的技巧是使用e选项,它将替换文本作为Perl表达式进行评估。