如何在PowerShell的正则替换中同时使用换行符和反向引用
问题原因
该问题本质是PowerShell字符串解析逻辑和正则替换的反向引用语法存在冲突:
- 用双引号包裹替换值时,PowerShell会先对字符串做变量展开和转义解析:
$1会被识别为未定义的PowerShell变量,直接替换为空值,只剩下n转义后的换行符,所以最终输出只剩second。 - 用单引号包裹替换值时,PowerShell不会对字符串做任何展开或转义,
`n会被当作普通字符保留,只有$1会被正则引擎识别为反向引用,所以输出会带字面的`n字符。
解决方案
你只需要在双引号里把$转义,避免PowerShell提前解析$1变量即可,正确代码如下:
'first@second' -replace '(fi.*t)@', "`$1`n"
运行后即可得到预期输出:
first second
可选兼容方案(PowerShell 7+)
如果使用PowerShell 7及以上版本,也可以用脚本块作为替换参数,无需处理转义冲突:
'first@second' -replace '(fi.*t)@', { $_.Groups[1].Value + [Environment]::NewLine }
内容的提问来源于stack exchange,提问作者Nemo XXX
相关产品推荐
相关产品推荐

