这是对我上一个问题的回应:
PowerShell: -replace, regex and ($) dollar sign woes
我的问题是:为什么这两行代码有不同的输出:
'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
发布于 2012-02-24 07:16:27
当您使用单引号时,您告诉PowerShell使用字符串文字,这意味着开始引号和结束引号之间的所有内容都要按字面解释。
当您使用双引号时,PowerShell将解释双引号中的特定字符。
请参阅get-help about_quoting_rules或单击here。
美元符号在正则表达式和PowerShell中有特殊的含义。如果要将美元符号用作正则表达式,则需要使用单引号。
在您的示例中,正则表达式匹配字母'a‘,然后匹配反向引用#1中捕获的单词字符。因此,当您替换为$1时,将匹配的文本ab替换为反向引用匹配b。所以你得到了bc。
在使用双引号的第二个示例中,PowerShell将"$1"解释为内部包含变量$1的字符串。您没有名为$1的变量,因此它为null。所以正则表达式用null替换了ab,这就是为什么只得到c的原因。
发布于 2013-09-27 06:51:07
在您的第二行中:
'abc‘-replace 'a(\w)',"$1“
Powershell会在执行regex替换操作之前替换$1,正如其他人所说的那样。您可以通过使用反标记来避免该替换,如:
'abc‘-replace 'a(\w)',"`$1“
因此,如果您想要在替换字符串中包含变量$prefix中的字符串,则可以将其用双引号引起来,如下所示:
'abc‘-replace 'a(\w)',"$prefix`$1"
发布于 2012-02-24 07:18:57
“$1”是正则表达式反向引用。它是由正则表达式匹配创建的,并且只存在于该替换操作的上下文中。它不是powershell变量。
"$1“将被解释为Powershell变量。如果不存在名为$1的变量,则替换值将为空。
https://stackoverflow.com/questions/9422669
复制相似问题