替换为编号的值

时间:2015-08-25 04:10:56

标签: regex perl powershell

假设我有一个字符串

$t = "some {great} vacation that {we} had that {year}"

我希望用编号值替换占位符:

  

"某些{0}假期{1}拥有{2}"

我预计会有一个替代品:

$i = 0; $t -replace "{.*?}", "{$([string] ++$i)}"

但我得到的是:

  

" {1}拥有{1}"

的{1}个假期

好像该字符串仅被评估一次。在perl正则表达式中,有一种方法可以为替换值指定一个函数......这是如何在psh中完成的?

2 个答案:

答案 0 :(得分:3)

试试这个:

$i = 0 ; [Regex]::Matches($t,"{.*?}") | %{ ++$i ; $t = $t.Replace($_.Value,"{$i}") } ; $t 

我认为问题在于Regex引擎永远不会为找到的每个匹配获得$ i的新值,所以每次递增它时,$i都是0

答案 1 :(得分:-1)

我无法找到使用-replace运算符执行此操作的方法,因此我不得不求助于.net - 这是一个执行此功能的函数:

function nrep($s) {
    $script:i = 0
    $fn = {"[$([string] $script:i++)]"}
    [regex]::replace($s, '{.*?}', $fn)
}