TL; DR
C#正規表現を使用してレポートを解析し、MultiLineを有効にして、名前付きグループを持つ単一の(複雑な)正規表現パターンを使用してファイル全体を処理しています。(およびCaptureCollection。)
レポートのセクションが順序どおりに表示されないか、予測できない方法で欠落しています。
それらが表示される順序に関係なく、どのようにそれらを一致させるのですか?
序文
System.Text.RegularExpressionsを使用してC#(.Net 3.5)の正規表現を使用してレポートを解析しています。レポートの1つのセクションは次のようになります。
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)+)+
)?
)
各セクションの非キャプチャグループの最初の行は「セクションヘッダー」と一致し、2番目の行はヘッダーと統計インスタンスの間の改行と一致し、3番目の行は個々の統計インスタンス(繰り返し、n個のインスタンス)と一致します。
問題
このレポートを生成するプログラムは、実行中のバージョンに応じて、各セクション(たとえば、セクションZ、セクション7、セクションC)を異なる順序で出力し、特定の状況では特定のセクションが欠落しています。2番目のテストファイルに対して実行したところ、セクションの順序が狂っていたために失敗しました。
したがって、セクション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