我正在编写一个PowerShell程序,用
替换字符串-replace "$in", "$out"
它对包含反斜杠的字符串不起作用,我该如何逃避呢?
答案 0 :(得分:10)
-replace
运算符使用正则表达式,将反斜杠视为特殊字符。您可以使用双反斜杠来获得文字的单反斜杠。
在您的情况下,由于您使用的是变量,我认为您在设计时不会知道内容。在这种情况下,您应该通过[RegEx]::Escape()
:
-replace [RegEx]::Escape($in), "$out"
该方法使用任何使其成为文字匹配所需的内容来转义任何特殊于正则表达式的字符(其他特殊字符包括.
,$
,^
,{{1} },()
等。
答案 1 :(得分:6)
您需要使用另一个反斜杠转义模式中的反斜杠,或者使用.Replace()
方法而不是-replace
运算符(但建议它们可能执行不同的操作):
PS C:\> 'asdf' -replace 'as', 'b'
bdf
PS C:\> 'a\sdf' -replace 'a\s', 'b'
a\sdf
PS C:\> 'a\sdf' -replace 'a\\s', 'b'
bdf
PS C:\> 'a\sdf' -replace ('a\s' -replace '\\','\\'), 'b'
bdf
请注意,只需要转义搜索模式字符串。代码-replace '\\','\\'
说,“将转义后的模式字符串'\\'
替换为单个反斜杠,使用未转义的文字字符串'\\'
,这是两个反斜杠。”
所以,你应该可以使用:
-replace ("$in" -replace '\\','\\'), "$out"
[注意:briantist's solution更好。]
但是,如果您的模式具有连续的反斜杠,则需要对其进行测试。
或者,您可以使用.Replace()
字符串方法,但正如我上面所述,它可能与-replace
运算符的行为完全匹配:
PS C:\> 'a\sdf'.replace('a\\s', 'b')
a\sdf
PS C:\> 'a\sdf'.replace( 'a\s', 'b')
bdf