从过去的经验来看,
PetSerAl
他在对这个问题的评论中提供了关键的指针,他不会回来发表答案。
热释光;博士
-replace
使用引用捕获组的替换操作数
和
动力壳
变量,使用如下语法
"`${<ndx>}${<PsVar>}"
<ndx>
是捕获组的索引,以及
<PsVar>
是PowerShell变量的名称;注意
`
在第一个之前
$
:
PS> $var = '2'; 'foo' -replace '(f)', "[`${1}$var]"
[f2]oo # OK, -replace saw '${1}2'
{...}
为了消除捕获组索引的歧义,替换发生故障,因为插入的字符串值随后有效地引用了不同的索引:
-替换
然后看到
[$12]
,这是由于引用了不存在的具有索引的捕获组
12
,保持原样:
PS> $var = '2'; 'foo' -replace '(f)', "[`$1$var]"
[$12]oo # !! -replace saw '$12', i.e., a nonexistent group with index 12
串展开
(插值)用
-替换
,因为它是
容易混淆
-
在
双引号
"..."
)字符串,这是PowerShell的泛型
串展开
$
字符
第一
前缀引用(PowerShell)
还有,里面
$(...)
.
-
结果
扩张的一部分是
-替换
接线员,哪里
$
-前缀标记指
正则表达式匹配操作的结果
,如中所述
this answer
.
-
请注意,这些层
解释是完全不相关的,事实上两者都使用sigil
是偶然的。
因此:
-
如果替换操作数
需要字符串扩展
变量
或
使用
字符串(
'...'
,这样PowerShell的字符串扩展就不会起作用:
PS> 'foo' -replace '(f)', '[$1]'
[f]oo # OK - if you had used "[$1]" instead, the output would be '[]oo',
# because $1 is then interpreted as a *PowerShell variable*.
-
如果你
做
:
为了说明后一点:
PS> $var = '2'; 'foo' -replace '(f)', "[`$1$var]"
[$12]oo # !! $1 wasn't recognizes as the 1st capture group.
问题是
-替换
,串展开后,锯
作为替换操作数,并且由于没有带索引的捕获组
,它保持原样。
将捕获组编号括在
解决问题:
PS> $var = '2'; 'foo' -replace '(f)', "[`${1}$var]"
[f2]oo # OK