我运行时:
$SearchStr = "c:programFilesxyz"
Select-String -pattern $SearchStr -path $env:SystemRootwin.ini
我收到一条错误消息,说字符串是"不是有效的正则表达式"
相比之下,当$SearchStr
不包含特殊字符时,它的工作正常。
为什么它不适用于诸如?
如果要 Select-String
匹配 literals (字面的子字符串匹配(,而不是(默认情况下(正则表达式,使用-SimpleMatch
:
Select-String -SimpleMatch -Pattern $SearchStr -Path $env:SystemRootwin.ini
相比之下,如果您需要将 a字面纳入正则表达式,请将[regex]::Escape()
应用于它,如TessellingHeckler所建议的。
例如,仅在Word Bornaries(b
(上找到$SearchStr
:
Select-String -Pattern ('b' + [regex]::Escape($SearchStr) + 'b') -Path $env:SystemRootwin.ini
可选的背景信息
默认情况下,Select-String
将传递给参数-Pattern
的搜索术语解释为Regexes(正则表达式(。
在正则表达式中, 具有特殊的含义:它用作 easce characte r修改常规表达引擎如何否则解释以下字符(s((。
因此,诸如c:programFilesxyz
之类的Windows式路径中的导致
字符的解释。作为逃脱序列的开始 。
使用示例路径: p
,如果后面是unicode字符类别(例如 {L}
(,则匹配该类别中的任何字符;x
,如果后跟2个十六进制数字,则与该代码点匹配一个字符。
逃脱 本身,以便对其进行处理字面上的, double it it it :
\
。 P>
.NET Framework [regex]::Escape()
方法可以为您做到这一点,并逃脱对Regex引擎具有特殊意义的其他字符。
换句话说:要在正则表达式中嵌入字面字符串,将其传递给[regex]::Escape()
。