regex - 匹配字符串之间的真假
问题描述
我正在尝试创建一个与-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|..
.
解决方案
您可以使用以下方法修复当前代码
$regex = [regex] "(?is)(?<=$string1).+?(?=$string2)"
这里,
.+?
用于尽可能少地匹配任何 1+ 字符,您需要量化消耗模式,而不是后视- 使用双引号形成字符串文字以支持字符串插值。此外,请参阅如何在 PowerShell 中将变量用作正则表达式的一部分?
- 您应该删除
\b
单词边界,因为它们取决于上下文(如果需要,您可以稍后添加任何进一步的限制)。
推荐阅读
- flutter - Flutter:从手机图库中预览一张或多张图片?
- php - 在foreach循环内以小时为单位获取两个日期之间的差异
- php - 有没有理由用自己的元素之一覆盖数组变量?
- facebook-graph-api - ID 为“”的 Facebook 对象不存在 - 用于公开的现有图片
- c# - 如何更改 RichTextBox 高度以适应 C# 中的新字体大小
- javascript - 如何将自定义文本按钮添加到 VideoJS Player v.7 的控制栏?
- python - 在 python 3.6 上工作但不在 3.7.3 上工作的方法的记忆
- python - Numpy 从另一个张量元素中明智地减去元素
- reactjs - 是否可以将项目拖动到水平 FlatList 范围之外?
- android - 能见度“自行”改变