TL;博士
我正在使用 C# 正则表达式解析报告,启用多行,使用具有命名组的单个(复杂)正则表达式模式处理整个文件。(和 CaptureCollection。)
我的报告部分出现乱序或以我无法预测的方式丢失。
无论它们出现的顺序如何,我如何匹配它们?
前言
我正在使用 System.Text.RegularExpressions 在 C# (.Net 3.5) 中使用正则表达式解析报告。报告的一部分如下所示:
Section Z 0 __ base 10
2 __ 19/04 20:06:39
2 __ 19/04 20:15:49
1.8 __ 19/04 20:09:35
1.6 __ 19/04 20:07:01
1.6 __ 19/04 20:08:29
Section 7 0.8 __ base 10
8 __ 18/04 21:03:01
7.3 __ 18/04 21:02:17
3.7 __ 19/04 08:41:09
3.4 __ 19/04 00:13:08
3.3 __ 18/04 21:02:50
Section C 0 __ base 10
19.7 __ 19/04 10:25:06
11.1 __ 19/04 10:15:01
8.8 __ 19/04 10:14:50
7.2 __ 19/04 19:51:37
6.1 __ 19/04 14:19:47
(?mx)
我的正则表达式使用选项(MultiLine、IgnorePatternWhitespace)将文本文件作为一个整体进行匹配。因为统计部分对每个部分都有子统计信息,所以我采取了手动制作每个部分的(可选?
)非捕获组 ( (?:match_this_text)
) 并按照我认为它们发生的顺序将它们放入模式中,如下所示:
(?mx) #Turn on options multiline, ignore whitespace.
(?: # base 10 statistic sections
(?:
[\s-[\n\r]]*(?i:Section\sZ)\s+(?<base10_SectionZ>\d+\.\d|\d+)\s__\sbase\s10
(?:\r?\n)+
(?:\s+(?<base10_SectionZ_instance>\d+\.\d|\d+)\s__\s(?<base10_SectionZ_instance_time>\d\d/\d\d\s\d\d:\d\d:\d\d)(?:\r?\n)+)+
)?
(?:
[\s-[\n\r]]*(?i:Section\s7)\s+(?<base10_Section7>\d+\.\d|\d+)\s__\sbase\s10
(?:\r?\n)+
(?:\s+(?<base10_Section7_instance>\d+\.\d|\d+)\s__\s(?<base10_Section7_instance_time>\d\d/\d\d\s\d\d:\d\d:\d\d)(?:\r?\n)+)+
)?
(?:
[\s-[\n\r]]*(?i:Section\sC)\s+(?<base10_SectionC>\d+\.\d|\d+)\s__\sbase\s10
(?:\r?\n)+
(?:\s+(?<base10_SectionC_instance>\d+\.\d|\d+)\s__\s(?<base10_SectionC_instance_time>\d\d/\d\d\s\d\d:\d\d:\d\d)(?:\r?\n)+)+
)?
)
每个部分的非捕获组的第一行匹配“部分标题”,第二行匹配标题和统计实例之间的换行符,第三行匹配单个统计实例(重复,n个实例)。
问题
生成此报告的程序根据运行的版本,以不同的顺序输出每个部分(例如,Z 部分、7 部分、C 部分),并且某些部分在某些情况下会丢失。当我针对第二个测试文件运行它时,它失败了,因为这些部分是乱序的。
因此,C 部分可能出现在 Z 部分之前,但正则表达式模式期望 Z 出现在 C 之前。
基本上,我希望相同的正则表达式匹配和提取(使用上面的命名组)相同的数据,而不管这些部分出现的顺序如何,这样它就可以匹配上面的测试数据和这个测试数据:
Section 7 0.8 __ base 10
8 __ 18/04 21:03:01
7.3 __ 18/04 21:02:17
3.7 __ 19/04 08:41:09
3.4 __ 19/04 00:13:08
3.3 __ 18/04 21:02:50
Section C 0 __ base 10
19.7 __ 19/04 10:25:06
11.1 __ 19/04 10:15:01
8.8 __ 19/04 10:14:50
7.2 __ 19/04 19:51:37
6.1 __ 19/04 14:19:47
Section Z 0 __ base 10
2 __ 19/04 20:06:39
2 __ 19/04 20:15:49
1.8 __ 19/04 20:09:35
1.6 __ 19/04 20:07:01
1.6 __ 19/04 20:08:29