在替换期间强制立即评估反向引用

问题描述 投票:2回答:2

我遇到了错误,我将字符串串联在一起以获取要替换的字段。

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

$TEXTTOREPLACEWITH= '6Q'

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

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

abc$(STRINGTOREPLACE)xyz

我期望以下输出:

abc6Qxyz

INSTEAD,当我运行此脚本时,输出如下:

$16Qxyz

我假设这是由于在字符串连接完成之前不得解析反向引用。在PowerShell中,有什么方法可以立即解决这些反向引用,并避免出现我看到的输出?

powershell replace
2个回答
3
投票

第一,缺少要点,答案已替换...

['$1''6Q'并置时(传递给正则表达式引擎之前,您会得到$16Q,并且没有16 th个捕获要替换。

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

请参见documentation,并注意:

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


0
投票

您也可以尝试使用命名的捕获组:

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

[regex]::Replace($x, $rx, $texttoreplacewith)
© www.soinside.com 2019 - 2024. All rights reserved.