1

我正在对一些数据进行正则表达式,如果 $_ 在“替换”部分,我也会得到内容。我为 $replace 尝试了各种方法,但似乎无法阻止这种行为。我也尝试过 [regex]::escape() 但是最终做同样的事情,只是使用转义字符。

我需要能够在替换中容忍 $_ 。我可以把它做成别的东西,然后再做一个修复,但这很丑,我宁愿避免它。

最后,如果 $replace='$anythingelse' 它似乎按预期运行,则只有 $_ 似乎会导致此问题。如果可以禁用所有解析,那也可以。

剧本:

 $contents = 'foo'
 $replace = '$_ bar'
 $final = $contents -replace 'oo', $replace
 Write-Output "Contents: $contents"
 Write-Output "Replace: $replace"
 Write-Output "Final: $final"

输出:

 Contents: foo
 Replace: $_ bar
 Final: ffoo bar

系统:Windows 7、PSH 2、64 位

那么我做错了什么还是这真的是一个错误?

编辑 6/29:

我做了一个替换,所以我可以做替换。这很愚蠢,应该有一种方法可以禁用解析(这也会让它运行得稍微快一些)。

 $contents = 'foo'
 $replace = '$_ bar'
 **$rep = $replace -replace '\$','$$$'**
 $final = $contents -replace 'oo', $rep
 Write-Output "Contents: $contents"
 Write-Output "Replace: $replace"
 Write-Output "Final: $final"

输出

 Contents: foo
 Replace: $_ bar
 Final: f$_ bar
4

1 回答 1

4

您的问题是替换字符串中的“$_”代表整个输入字符串。如果你想要一个文字美元符号,你需要使用 $$ 转义它:

$replace = '$$_ bar'

有关详细信息,请参阅 msdn 上的替换页面!

编辑以解决问题编辑 29/6

如果您想要的只是一个没有任何正则表达式的基本字符串替换,只需使用标准字符串替换而不是-replace

$final = $contents.replace('oo', $replace)
于 2012-06-29T02:10:25.660 回答