替换部分匹配不起作用

时间:2015-08-10 08:29:14

标签: regex powershell replace

我需要使用远程路径“\ PC \ C $ \ Program Files \ Path”替换“C:\ Program Files \ Path”行中的本地路径。我为此构建了一个正则表达式如下:

$path -replace '^(?<ddd>\w):',"\\$($pc.name)\${ddd}`$"

$path包含从注册表中检索到的路径,并且已知是有效路径。我正在测试这条道路:C:\Program Files\Path。由于某种原因,它无法检索正确的路径,错过了驱动器名称。结果总是这样:\\MY_PC\$\Program Files\Path。使用$matches进行测试会返回:

if ($path -match '^(?<ddd>\w):') {$matches}
Name                           Value
----                           -----
ddd                            C
0                              C:

也就是说,匹配正则表达式并正确填充$matches。填充$1而不是${ddd}也不起作用。那么,我做错了什么以及如何解决这种奇怪的行为?

PS:我需要在单个替换正则表达式中保留$($pc.name)${ddd}。在第二个正则表达式中使用单引号可以正确替换驱动器号,但是会禁止替换PC的名称。

1 个答案:

答案 0 :(得分:0)

解决方案是使用双引号进行正则表达式,但是要使用反引号来替换替换组名称之前的美元符号。原因显然是字符串被双重解析,第一个Powershell引擎使用美元符号来替换评估字符串,第二个正则表达式引擎使用美元符号语法来使用替换组。因此,美元符号的逃逸需要美元符号才能在第一阶段解析后存活并正确地替换为匹配区域。正确的命令如下:

$path -replace '^(?<ddd>\w):',"\\$($pc.name)\`${ddd}`$"

另一方面,如果您需要使用两个替换组,Powershell会在某处评估字符串和美元符号放置到结果字符串中,但在替换结束时,您需要使用两个转义元:

$path -replace '1',"`$`$1" # replaces "1" with "$1" literally