首页 > 解决方案 > 匹配字符串之间的真假

问题描述

我正在尝试创建一个与-match运算符一起使用的正则表达式。以下已经有效:

# Exact match
$string1 = [Regex]::Escape('C:\Fruit\kiwi')
$regex = [regex] '^{0}$' -f $string1
'C:\Fruit\kiwi' -match $regex

# Match where trail is allowed ( -like 'c:\folder*')
$string1 = [Regex]::Escape('C:\Fruit\kiwi')
$regex = [regex] '^{0}' -f $string1
'C:\Fruit\kiwi\other folder' -match $regex

现在我们尝试在两个字符串之间存在某些内容时进行匹配,但这失败了:

# Match in between strings
$string1 = [Regex]::Escape("C:\Fruit")
$string2 = [Regex]::Escape("\kiwi")
$regex = [regex] '(?is)(?<=\b{0}\b)+?(?=\b{1}\b)' -f $string1, $string2
'C:\Fruit\d\kiwi' -match $regex

根据文档,它说:

  • '*' 匹配 0 次或多次
  • '+' 匹配 1 次或多次
  • “?” 匹配 1 或 0 次
  • “*?” 匹配 0 次或多次,但尽可能少
  • “+?” 匹配 1 次或多次,但尽可能少

所以我期待介于C:\Fruit和之间的任何事情\kiwi都会导致,true但事实并非如此。我们做错了什么?我们只追求真假,因为最终我们会将这些碎片粘合在一起,就像regex1|regex2|...

标签: regexpowershell

解决方案


您可以使用以下方法修复当前代码

$regex = [regex] "(?is)(?<=$string1).+?(?=$string2)"

这里,

  • .+? 用于尽可能少地匹配任何 1+ 字符,您需要量化消耗模式,而不是后视
  • 使用双引号形成字符串文字以支持字符串插值。此外,请参阅如何在 PowerShell 中将变量用作正则表达式的一部分?
  • 您应该删除\b单词边界,因为它们取决于上下文(如果需要,您可以稍后添加任何进一步的限制)。

推荐阅读