特定の値を解析したいファイルがあります。次の 3 つの正規表現をすべて組み合わせて、測定値があるかどうか、エラーがあるかどうか、および測定値とエラーがある場合はそれらを含めて、各テストのエントリの 1 つのグループを返すにはどうすればよいですか? 任意の数のテスト、任意の数の測定がテストに含まれる可能性がありますが、他の測定がないテストには 1 つのエラーがあります。さまざまな組み合わせを試しましたが、成功しませんでした。先読みと代替を使用する必要があると思いますが、適切な組み合わせが見つかりません。参考までに、正規表現はデータベースに格納され、C# アプリケーションで使用されます。前もって感謝します!
入力ファイル:
<event>
<common>
<event_start_time>2014-01-29T17:30:36</event_start_time>
<operator>10586546</operator>
<shift>A</shift>
<program>PPM</program>
<program_revision>eo01</program_revision>
</common>
<test_instance>
<teststart startid = "ABCDEF">
<test>MB</test>
<test_start_time>2014-01-29T17:30:39</test_start_time>
<exe>HelloWorld</exe>
<subtest>CheckVersion</subtest>
<subtest_number>1</subtest_number>
</teststart>
<testend endid = "ABCDEF">
<test_result>PASS</test_result>
<test_duration duration_units="millisec">1000</test_duration>
</testend>
<teststart startid = "CDEFG">
<test>MB</test>
<test_start_time>2014-01-29T17:30:40</test_start_time>
<exe>HelloWorld</exe>
<subtest>Program1</subtest>
<subtest_number>2</subtest_number>
</teststart>
<measurement measid = "CDEFG">
<measurement_name>CycleCounter </measurement_name>
<numeric_measurement> 1</numeric_measurement>
<measurement_time>2014-01-29T17:30:50</measurement_time>
</measurement>
<measurement measid = "CDEFG">
<measurement_name>Counter </measurement_name>
<numeric_measurement> 1</numeric_measurement>
<measurement_time>2014-01-29T17:30:50</measurement_time>
</measurement>
<testend endid = "CDEFG">
<test_result>PASS</test_result>
<test_duration duration_units="millisec">10000</test_duration>
</testend>
<teststart startid = "xYZABC">
<test>MB</test>
<test_start_time>2014-01-29T17:36:01</test_start_time>
<exe>HelloWorld</exe>
<subtest>Check2</subtest>
<subtest_number>17</subtest_number>
</teststart>
<measurement measid = "xYZABC">
<measurement_name>ERROR1</measurement_name>
<error_code>31001717</error_code>
<error_message>MB:FAILED_CHECK_TEST</error_message>
<measurement_time>2014-01-29T17:36:50</measurement_time>
<measurement_result>FAIL</measurement_result>
</measurement>
<testend endid = "xYZABC">
<test_result>FAIL</test_result>
<test_duration duration_units="millisec">49000</test_duration>
</testend>
</test_instance>
<event_duration duration_units="sec">374</event_duration>
<event_result>FAIL</event_result>
テスト部分を解析するために、正規表現を使用しています。
\<teststart\sstartid\s=\s"
(?<tid>.*?)"\>
.*\n
.*\<test\>
(?<testid>.*?)\<
.*\n
.*\<test_start_time\>
(?<teststartdate>.*?)T
(?<teststarttime>.*?)\</.*\n
.*?
\<exe\>
(?<texe>.*?)\<.*\n
(.*?\n)*?
.*?\<testend.*?\n
.*?\<test_result\>
(?<result>.*?)\<.*\n
.*?duration_units="
(?<dunits>.{1}).*?
\>
(?<duration>.*?)\<
測定データを解析するには、次の正規表現を使用します。
.*?\<measurement\smeasid\s=\s"
(?<measid>.*?)"\>.*\r\n
(.*?\r\n)*?
.*?
\<measurement_name\>
(?<measurename>.*?)\<.*\r\n
.*?
\<numeric_measurement\>
(?<measurenum>[^/s].*?)\<.*\r\n
.*?
\<measurement_time\>
(?<measureDate>[^/s].*?)T
(?<measureTime>[^/s].*?)\<.*\r\n
エラーを解析するには、次の正規表現を使用します。
.*?\<measurement\smeasid\s=\s"
(?<measid>.*?)"\>.*\r\n
.*?\<measurement_name\>
(?<measurename>.*?)\<.*\r\n
.*?\<error_code\>
(?<sterrcode>.*?)\<.*\r\n
.*?\<error_message\>
(?<sterrmsg>.*?)\<.*\r\n
.*?\<measurement_time\>
(?<measureDate>[^/s].*?)T
(?<measureTime>[^/s].*?)\<.*\r\n
.*?\<measurement_result\>
(?<measureResult>[^/s].*?)\<.*\r\n
免責事項: はい、入力が XML であることはわかっていますが、アプリケーションをデシリアライズするように変更することはできません。正規表現を使用しています。