我正在编写一个PowerShell程序,用于替换字符串
-replace "$in", "$out"
如果字符串包含反斜杠,它将无法正常工作,我该如何进行转义处理?
我正在编写一个PowerShell程序,用于替换字符串
-replace "$in", "$out"
如果字符串包含反斜杠,它将无法正常工作,我该如何进行转义处理?
-replace
运算符使用正则表达式,其中反斜杠被视为特殊字符。您可以使用双反斜杠来获得一个字面上的单个反斜杠。
在您的情况下,由于您正在使用变量,我假设在设计时您不会知道其内容。在这种情况下,您应该通过[RegEx] :: Escape()
运行它:
-replace [RegEx]::Escape($in), "$out"
该方法会使用必要的内容将任何对于正则表达式而言具有特殊意义的字符进行转义,使其成为文本匹配(另外一些特殊字符包括.
、$
、^
、()
、[]
等等)。
Regex.Escape
。这是一个比我的更好的解决方案,因为PowerShell应该可以正确转义它。 - Bacon Bits。
已包含在我的非穷尽字符列表中,并且也通过推荐的方法进行了转义。 - briantistPS 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的解决方案更好。]
但是,如果您的模式具有连续的反斜杠,则需要进行测试。
或者,您可以使用.Replace()
字符串方法,但正如我上面所说,它可能无法完全匹配-replace
运算符的行为:
PS C:\> 'a\sdf'.replace('a\\s', 'b')
a\sdf
PS C:\> 'a\sdf'.replace( 'a\s', 'b')
bdf
'asdf' -replace '[ad]', '1234'
返回结果为1234s1234f
。 - Bacon Bits-replace ([RegEx]::Escape($in)), "$out"
比我的好。如果我记得这个函数,我本应该使用它。 - Bacon Bits