2

我遇到了一个错误,我将字符串连接在一起以获得我想要替换的字段。

以下是我的脚本正在执行的示例:

$TEXTTOREPLACEWITH= '6Q'

(Get-Content testfile.html) | ForEach-Object { $_ -replace '(.*)\$\(STRINGTOREPLACE\)(.*)', ('$1' +$TEXTTOREPLACEWITH+'$2')

如果我对具有以下行输入的文件运行此命令:

abc$(STRINGTOREPLACE)xyz

我期望以下输出:

abc6Qxyz

相反,当我运行此脚本时,输出如下所示:

$16Qxyz

我假设这是因为在字符串连接完成之前不能解析反向引用。PowerShell 中是否有任何方法可以立即解决这些反向引用并避免我看到的输出?

4

2 回答 2

3

1st,错过了重点,答案被替换了......

当连接'$1''6Q'(在传递给正则表达式引擎之前)你得到$16Q并且没有第 16捕获要替换。

为避免这种情况,请在匹配 ( (?<name>)) 和${name}替换字符串中使用命名组。

请参阅文档,并注意:

如果number未指定正则表达式模式中定义的有效捕获组,则将$number其解释为用于替换每个匹配项的文字字符序列。

于 2013-08-28T19:55:19.390 回答
0

You can also try using named capture groups:

$rx = '(?i)(?<Beg>.*)\$\(STRINGTOREPLACE\)(?<End>.*)'
$texttoreplacewith='${Beg}6Q${End}'
$x = "abc`$(stringtoreplace)xyz"

[regex]::Replace($x, $rx, $texttoreplacewith)
于 2013-08-28T20:19:01.140 回答