c# - 使用 .NET 正则表达式,是否可以在重复捕获中捕获组?
问题描述
我正在验证一个字符串,该字符串必须包含与模式匹配的前缀(称为它pat1
),后跟 0 个或多个重复模式,每个模式都包含我想单独捕获的 3 个子模式( pat2
、pat3
、 )。pat4
稍微简化一下,正则表达式基本上是这样的:
^pat1 ((pat2) (pat3) (pat4))*$
^
存在and$
锚点是因为如果字符串在开头或结尾包含任何无关字符,则匹配将失败。
使用Regex.Match
有效的表达式,我得到一个Match
具有以下特征的对象:
- 5
Groups
,由整个表达式、最后一个匹配的组(即 的最后一次出现pat2 pat3 pat4
)和最后一个pat2
、pat3
和pat4
单独的匹配组成。这一切都有据可查,完全符合预期。 Groups[1].Captures
每次出现都包含一个Capture
. 也如预期。pat2 pat3 pat4
我不知道该怎么做pat2
是从每个. 这甚至可以通过单个正则表达式的单次执行来实现吗?我开始不这么认为了。(如果有房产,那可能正是我需要的。但它没有。)pat3
pat4
Capture
Capture
Groups
如果我使用完全不同的方法Regex.Matches
代替Regex.Match
,我想我可以捕获我需要的所有单个位,但它不会验证字符串在匹配之前、之后或之间不能包含无关字符。
所以我现在采取的是执行原始表达式,迭代Groups[1].Captures
并再次执行正则表达式(这次只是(pat2) (pat3) (pat4)
),只是为了解析每个捕获中的 3 个组。这感觉就像我正在让引擎重复已经完成的工作,但也许这是唯一的方法?
作为旁注,我做了很多搜索“捕获中的组”等,并且非常惊讶地出现空缺。我认为这是一种常见的情况,这让我想知道我是否应该采取完全不同的方法。我愿意接受任何以合理有效的方式满足所有验证和捕获要求的建议。
解决方案
推荐阅读
- mysql - 如何将 APNS/FCM 的推送设备令牌存储在带有索引的 MySQL 数据库中?
- c# - 通过 Gmail API 发送 HTML 电子邮件会生成带有纯文本标记的邮件
- r - gzfile(文件,“rb”)中的错误:无效的“描述”参数调用自:gzfile(文件,“rb”)
- ios - 无法关闭应用中显示的推送通知
- javascript - ReactTable (ReactJS) - 在行中搜索过滤 HTML 内容不起作用
- javascript - 删除 DocxTemplater 中的空行
- reactjs - 如何使用 gatsby.navigate 函数编写一个有趣的单元测试?
- join - 连接 2 个 pysaprk 数据帧并从连接中删除重复行
- android - 迁移到 Androidx 后 Firebase 18.XX 出现问题
- c - 为什么我的结构没有变化?(链表)