字符串之间匹配真假

时间:2020-02-27 13:07:02

标签: regex powershell

我正在尝试创建一个与-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|..一样将这些片段粘合在一起。

1 个答案:

答案 0 :(得分:1)

您可以通过使用

来修复当前代码
$regex = [regex] "(?is)(?<=$string1).+?(?=$string2)"

在这里

  • .+?用于尽可能少地匹配任何1个以上的字符,您需要量化一种消耗模式,而不是向后看
  • 使用双引号形成字符串文字,以支持字符串插值。另外,请参见How to use a variable as part of a regular expression in PowerShell?
  • 的更多选项
  • 您应删除\b个单词边界,因为它们取决于上下文(您可以在以后根据需要添加其他限制)。