我遇到了错误,我将字符串串联在一起以获取要替换的字段。
下面是我的脚本正在执行的示例:
$TEXTTOREPLACEWITH= '6Q'
(Get-Content testfile.html) | ForEach-Object { $_ -replace '(.*)\$\(STRINGTOREPLACE\)(.*)', ('$1' +$TEXTTOREPLACEWITH+'$2')
如果我对具有以下行输入的文件运行此命令:
abc$(STRINGTOREPLACE)xyz
我期望以下输出:
abc6Qxyz
INSTEAD,当我运行此脚本时,输出如下:
$16Qxyz
我假设这是由于在字符串连接完成之前不得解析反向引用。在PowerShell中,有什么方法可以立即解决这些反向引用,并避免出现我看到的输出?
第一,缺少要点,答案已替换...
['$1'
和'6Q'
并置时(传递给正则表达式引擎之前,您会得到$16Q
,并且没有16 th个捕获要替换。
为避免这种情况,请在匹配项((?<name>)
)和替换字符串中的${name}
中使用命名组。
请参见documentation,并注意:
如果number没有指定在正则表达式模式中定义的有效捕获组,则
$number
被解释为用于替换每个匹配项的文字字符序列。
您也可以尝试使用命名的捕获组:
$rx = '(?i)(?<Beg>.*)\$\(STRINGTOREPLACE\)(?<End>.*)'
$texttoreplacewith='${Beg}6Q${End}'
$x = "abc`$(stringtoreplace)xyz"
[regex]::Replace($x, $rx, $texttoreplacewith)