我有一个字符串列表,需要检查每个项目以查看它是否包含一些字符串$path
,其中字符串应包含unc路径,$path
也是一个unc路径。< / p>
例如:
"RW \\test" -match "\\test"
返回True
,\\test
中包含RW \\test
。大。
那为什么会返回False
? :
"RW \\test\te" -match "\\test\te"
起初我可能只是单个反斜杠以某种方式充当转义字符(即使在PowerShell中应该是`)
所以我试过
"RW \\test\\te" -match "\\test\\te"
但这也会返回False
....
为什么?
答案 0 :(得分:2)
您需要在-match
运算符右侧的正则表达式中使用反斜杠转义两个反斜杠。
PS /> "RW \\test\te" -match "\\\\test\\te"
True
结果如下:
PS /> $matches[0]
\\test\te
您还可以对此进行扩展,以在正则表达式中使用命名捕获。命名捕获只是为正则表达式中的各个捕获提供友好名称,使它们更容易被引用为$matches
变量上的属性,而不是数字索引。
PS /> "RW \\test\te" -match "(?<UNCPath>\\\\test\\te)"
True
PS /> $matches.UNCPath
\\test\te
请记住,反引号字符用于转义PowerShell双引号字符串中的某些特殊字符。但是,对于-match
运算符,您正在调用.NET正则表达式引擎。在.NET正则表达式引擎中,反斜杠用于转义正则表达式上下文中的特殊字符。因此,在此示例中,反引号转义字符不适用。
此外,请确保您 在-match
运算符左侧的源字符串中转义特殊字符。您的最终示例不匹配的原因是,您添加了第二个\
,但仅在\
运算符右侧的正则表达式中转义了一个-match
答案 1 :(得分:2)
使用Trevor Sullivan's helpful answer在问题评论中提供的提示来补充PetSerAl:
要在正则表达式上下文中将字符串用作文字,请将其传递给[regex]::Escape()
:
PS> "RW \\test\te" -match [regex]::Escape("\\test\te")
True
[regex]::Escape()
可以方便地转义具有转义字符\
的正则表达式中具有特殊含义的所有字符,以便字符串匹配为文字:
PS> [regex]::Escape("\\test\te")
\\\\test\\te
请注意\
个实例如何使用\
进行转义,实际上将它们加倍。
如果您的字符串确实使用正则表达式构造,但也包含您希望被视为文字的正则表达式中具有特殊含义的字符,则必须\
- 单独转义它们:
PS> '***' -match '\**' # match zero or more (*) '*' chars (\*)
True
答案 2 :(得分:1)
有些正交,但对于匹配路径,您可能会发现-like
运算符更易于使用。它支持通配符而不是正则表达式,因此您可以将您的示例编写为
"RW \\test\te" -like "*\\test\te"
请注意领先&#39; *&#39;在RHS上是必需的 - 通配符模式是&#34;锚定&#34; (必须匹配整个字符串)。默认情况下,正则表达式是非锚定的,只需匹配字符串的片段。