【问题标题】:-match fails when checking if a string contains a path-match 在检查字符串是否包含路径时失败
【发布时间】:2018-08-31 08:13:05
【问题描述】:

我有一个字符串列表,需要检查每个项目是否包含某个字符串$path,其中该字符串应包含一个unc 路径,而$path 也是一个unc 路径。

例如:

"RW \\test" -match "\\test"

返回True,因为\\test 包含在RW \\test 中。太好了。

那么为什么会返回 False 呢? :

"RW \\test\te" -match "\\test\te"

起初,我认为单个反斜杠可能以某种方式充当转义字符(即使在 PowerShell 中应该是 `)

所以我尝试了

"RW \\test\\te" -match "\\test\\te"

但这也返回False ....

为什么?

【问题讨论】:

  • "RW \\test\\te" -match "\\\\test\\\\te"
  • @PetSerAl 感谢您的评论。所以第二个字符串(比较器)需要用 \\? 转义 \s
  • [Regex]::Escape('\\test\\te')

标签: string powershell path escaping


【解决方案1】:

您需要在 -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 运算符右侧的正则表达式中转义了一个 \。

【讨论】:

  • @Bassie 很高兴为您服务。 :) 当您不熟悉正则表达式时,它可能会很混乱!我以前去过那里。希望这可以帮助您从经验中学习。
【解决方案2】:

用PetSerAl 在对该问题的评论中提供的提示来补充Trevor Sullivan's helpful answer:

要在正则表达式上下文中将字符串用作文字,请将其传递给[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

【讨论】:

    【解决方案3】:

    有些正交,但对于匹配路径,您可能会发现-like 运算符更易于使用。它支持通配符而不是正则表达式,所以你可以把你的例子写成

    "RW \\test\te" -like "*\\test\te"
    

    请注意,RHS 上的前导 '*' 是必需的 - 通配符模式是“锚定的”(必须匹配整个字符串)。正则表达式默认是未锚定的,只需要匹配字符串的一个片段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-09
      • 2013-05-18
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      相关资源
      最近更新 更多