如何在Powershell中逃避反斜杠

Zak*_*iti 7 windows powershell

我正在编写一个PowerShell程序来替换字符串

-replace "$in", "$out"
Run Code Online (Sandbox Code Playgroud)

它对包含反斜杠的字符串不起作用,我该如何逃避呢?

bri*_*ist 10

-replace运营商使用正则表达式,它把反斜线作为一个特殊字符.您可以使用双反斜杠来获得文字单反斜杠.

在您的情况下,由于您使用的是变量,我认为您在设计时不会知道内容.在这种情况下,您应该运行它[RegEx]::Escape():

-replace [RegEx]::Escape($in), "$out"
Run Code Online (Sandbox Code Playgroud)

该方法逃脱是特殊与无论是让他们字面匹配(其它特殊字符,包括需要正则表达式的任何字符.,$,^,(),[],等等.


Bac*_*its 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
Run Code Online (Sandbox Code Playgroud)

请注意,只需要转义搜索模式字符串.代码-replace '\\','\\'说,"将转义后的模式字符串替换'\\'为单个反斜杠,使用未转义的文字字符串'\\',即两个反斜杠."

所以,你应该可以使用:

-replace ("$in" -replace '\\','\\'), "$out"
Run Code Online (Sandbox Code Playgroud)

[注意:briantist的解决方案更好.]

但是,如果您的模式具有连续的反斜杠,则需要对其进行测试.

或者,您可以使用.Replace()字符串方法,但正如我上面所说,它可能不完全匹配-replace运算符的行为:

PS C:\> 'a\sdf'.replace('a\\s', 'b')
a\sdf
PS C:\> 'a\sdf'.replace( 'a\s', 'b')
bdf
Run Code Online (Sandbox Code Playgroud)

  • @ZakariaBelghiti第二个字符串实际上是采用的。原因是因为-replace的第一个参数被评估为正则表达式:''asdf'-replace'[ad]','1234'`返回`1234s1234f`。 (3认同)