当我运行时:
$SearchStr = "c:\programFiles\xyz"
Select-String -pattern $SearchStr -path $env:SystemRoot\win.ini
我收到一条错误消息,指出字符串“不是有效的正则表达式”
相比之下,它在$SearchStr
不包含特殊字符时工作正常。
为什么它不适用于特殊字符,例如\
?
当我运行时:
$SearchStr = "c:\programFiles\xyz"
Select-String -pattern $SearchStr -path $env:SystemRoot\win.ini
我收到一条错误消息,指出字符串“不是有效的正则表达式”
相比之下,它在$SearchStr
不包含特殊字符时工作正常。
为什么它不适用于特殊字符,例如\
?
如果要Select-String
匹配文字(文字子字符串匹配)而不是(默认情况下)正则表达式,请使用-SimpleMatch
:
Select-String -SimpleMatch -Pattern $SearchStr -Path $env:SystemRoot\win.ini
相比之下,如果您需要将文字合并到正则表达式[regex]::Escape()
中,请按照TessellatingHeckler的建议应用它。
例如,仅$SearchStr
在单词边界 ( \b
) 处查找:
Select-String -Pattern ('\b' + [regex]::Escape($SearchStr) + '\b') -Path $env:SystemRoot\win.ini
默认情况下,Select-String
将传递给参数的搜索词解释-Pattern
为正则表达式(正则表达式)。
在正则表达式中,\
具有特殊含义:它用作转义字符以修改正则表达式引擎如何解释以下字符。
因此,\
Windows 样式的路径(例如)c:\programFiles\xyz
会导致对字符的解释。\
作为转义序列的开始。
使用示例路径:\p
,如果后跟 Unicode 字符类别,例如{L}
,则匹配该类别中的任何字符;\x
,如果后跟 2 个十六进制数字,则匹配具有该代码点的单个字符。
为了逃避\
自己,以便按字面意思对待它,请加倍:\\
。
.NET 框架[regex]::Escape()
方法可以为您执行此操作,同时转义对正则表达式引擎具有特殊意义的任何其他字符。
换句话说:要在正则表达式中嵌入文字字符串,请将其传递给[regex]::Escape()
first。