-match在检查字符串是否包含路径时失败

时间:2018-03-22 02:04:03

标签: string powershell path escaping

我有一个字符串列表,需要检查每个项目以查看它是否包含一些字符串$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 ....

为什么?

3 个答案:

答案 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; (必须匹配整个字符串)。默认情况下,正则表达式是非锚定的,只需匹配字符串的片段。