鑑於以下代碼:的powershell正則表達式與問題線錨定件的的powershell 2對比的powershell 5端
$inputString = "`r`n#cmakedefine BREAK_THE_CODE`r`n"
$match = '(?m)^(.*?)#cmakedefine(.*?)$'
$replace = 'hello $1#undef$2 goodbye '
$retVal = $inputString -replace $match,$replace -join "`r`n"
Write-Host $retVal
Powershell的5產生以下的(預期的)輸出:
hello #undef BREAK_THE_CODE goodbye
Powershell的2產生(意外)輸出:
goodbye def BREAK_THE_CODE
任何人都知道爲什麼?或者有一個解決方法。如果使用[regex ::],我會更加一致。我需要兩個版本才能產生相同的結果。對於它的價值,你好和再見將最終成爲/*
和*/
,但我試圖避免混淆與任何可以解釋爲特殊字符的問題。
編輯:下面馬特的答案是詳細說明了兩個Powershell的版本產生相同的輸出,[CR][LF]hello #undef BREAK_THE_CODE[CR] goodbye [LF]
和版本之間的明顯差異實際上是ISE與不ISE和Write-Host
。所以這裏的根本問題是我的正則表達式剛剛壞掉,儘管我仍然不知道這是爲什麼。
我結束了:
$match = "(?m)^(.*?)#cmakedefine([^\r\n]*)"
$replace = '/* $1#undef$2 */'
作爲一個小工具條,對VS 2015年IDE幫助(這幾乎可以肯定使用相同的正則表達式引擎)列出\r?$
爲線錨的正常結束: https://msdn.microsoft.com/en-us/library/2k3te2cs.aspx
通過捕獲它的\r
部分,可以使該錨點工作,我最初的做法是,但我首選Wiktor的解決方案。
您可以大大提升'(*)(\'R)' - 。。?看我怎麼回答。 –