我正在尝试创建一个与-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|..
一样将这些片段粘合在一起。
答案 0 :(得分:1)
您可以通过使用
来修复当前代码$regex = [regex] "(?is)(?<=$string1).+?(?=$string2)"
在这里
.+?
用于尽可能少地匹配任何1个以上的字符,您需要量化一种消耗模式,而不是向后看\b
个单词边界,因为它们取决于上下文(您可以在以后根据需要添加其他限制)。