C#中如何使用正则捕获相邻Division匹配项之间的可选行内容
问题说明
当前使用的正则表达式如下:
(?>Division: (\d+))(?>.*?\")?(.*?(?=\"))?
需要实现的匹配规则:
- 捕获所有
Division: 数字格式的条目,将数字编号存入第1个捕获分组 - 捕获Division行自带的引号包裹的Description内容,存入第2个捕获分组
- 捕获两个相邻Division条目之间的所有行内容,整体存入前一个Division匹配项的第3个捕获分组,无需拆分内容。例如示例中Division:8和Division:9之间的两行附属内容,需要全部归入Division:8对应的第3分组。
待匹配示例文本:
[Divisions] Division: 1 Division: 2 Division: 3, Description: "(test1)" Division: 4 Division: 5 Division: 6, Description: "test2" Division: 7 Division: 8 Console, Events: Fires, Alarams Printer, Events: Fires, Alarams Division: 9 Division: 10
开发环境为C#。
可用正则及使用说明
直接使用以下正则表达式,匹配时开启RegexOptions.Singleline选项(允许.匹配换行符)即可:
Division:\s*(\d+)(?:[^"]*"([^"]*)")?\s*(.*?)(?=\s*Division:|\s*$)
各捕获分组对应内容:
- 分组1:Division后的数字编号
- 分组2:当前Division行引号内的Description内容,无Description时该分组捕获为空
- 分组3:当前Division条目之后、下一个Division条目之前(或文本末尾之前)的所有附属行内容,无附属行时该分组捕获为空
匹配效果验证
针对给出的示例文本:
- Division:3的分组2捕获结果为
(test1),分组3为空 - Division:6的分组2捕获结果为
test2,分组3为空 - Division:8的分组2为空,分组3捕获结果为两行附属内容:
Console, Events: Fires, Alarams Printer, Events: Fires, Alarams - Division:10为最后一个条目,分组3为空
所有匹配结果完全符合需求,不会出现跨条目错配问题。
内容的提问来源于stack exchange,提问作者Dasic
相关产品推荐
相关产品推荐

