2012-02-23 98 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」