2012-02-23 60 views
13

这是针对我刚才的问题:的PowerShell:报价-replace&变量

PowerShell: -replace, regex and ($) dollar sign woes

我的问题是:为什么这2行代码有不同的输出:

'abc' -replace 'a(\w)', '$1' 
'abc' -replace 'a(\w)', "$1" 

根据以下两篇文章,为什么单引号中的变量'$ 1'不能用作文字串?单引号中的所有内容都应该被视为文本字符串,对吗?

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

回答

18

当您使用单引号告诉PowerShell中使用开口之间的字符串字面含义的一切,收盘报价是按字面解释。

当您使用双引号时,PowerShell将解释双引号内的特定字符。

请参阅get-help about_quoting_rules或点击here

美元符号在正则表达式和PowerShell中有特殊含义。如果您打算使用美元符号作为正则表达式,您希望使用单引号。

在您的示例中,正则表达式a(\w)与字母“a”匹配,然后匹配反向引用#1中捕获的单词字符。因此,当您替换为$1时,您将使用返回参考匹配b替换匹配文本ab。所以你得到bc

在使用双引号的第二个示例中,PowerShell将"$1"解释为带有变量$1的字符串。您没有名为$1的变量,因此它为空。所以正则表达式用空值代替ab,这就是为什么你只能得到c

+1

(灯光熄灭)马恩,谢谢。很好解释。 – Vippy 2012-02-23 23:31:35

3

'$ 1'是一个正则表达式反向引用。它是由正则表达式匹配创建的,它只存在于替换操作的上下文中。它不是一个PowerShell变量。

“$ 1”将被解释为Powershell变量。如果不存在称为$ 1的变量,则替换值将为空。

+0

另外,感谢您的洞察力。任何帮助。 – Vippy 2012-02-23 23:32:02

11

在你的第二个行:

'ABC' -replace,A(\ W)“, ”$ 1“

Powershell的替换1 $它得到的正则表达式之前替换操作,正如其他人所说的。那么就可以避免更换通过使用反引号,如:

'ABC' -replace,A(\ W)“, ”`$ 1“

因此,如果你有一个字符串一个可变的$前缀,你想包括在替换字符串中,你可以在这样的双引号中使用它:

'abc'-replace'a(\ w)',“$ prefix` $ 1”