1

当我运行时:

$SearchStr = "c:\programFiles\xyz"
Select-String -pattern $SearchStr -path $env:SystemRoot\win.ini

我收到一条错误消息,指出字符串“不是有效的正则表达式”

相比之下,它在$SearchStr不包含特殊字符时工作正常。

为什么它不适用于特殊字符,例如\

4

1 回答 1

8

如果要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。

于 2017-04-21T21:33:31.813 回答