TL; DR
私は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)
(複数行、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行目はヘッダと統計インスタンス間の改行と一致し、そして第三は、個々の統計インスタンスと一致する(繰り返し、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
読むファイルは、それらのそれぞれのセクションを並べ替えた後、複数行の文字列やコメントのきちんとした正規表現のレイアウトや使用のために...それに –
賞賛を自分のものを行います! – jessehouwing
私の最終的な解決策は、文字列としてファイル全体に対して単一の巨大な正規表現を使用することではありませんでした。代わりに、私は行を列挙し、行がセクション開始マーカーであるかどうかを再帰的に検索する親子(セクションインスタンス)パターンのスタックを使用します。そうであれば、次の行で子(インスタンス)パターンを試行し、それがうまくいけば、次の行で子を再試行します。子が次の行で失敗すると、一致するものが見つかるまでスタックをポップします。スタックのルートは(。*)であり、ルートにヒットした場合(可能なすべてのパターンを通ります)、そのラインは無視されます。 – Lingnik