0

正規表現を使用してログ ファイルを解析しようとしています。問題は、複数行のエラーを含めることができるように SingleLine モードをオンにするとすぐに発生し、将来の一致はそれ自体ではなく最初の一致に含まれます。

わかりやすくするために、ログ ファイルの例を次に示します。

エラー 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

エラー 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

テスト

エラー 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

エラー 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

情報 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

テスト 2

エラー 16-08 11:09:59,015 - sdsdfsdfsdfsdfsdf

エラー 16-08 11:09:59,015 – sdsdfsdfsdfsdfsdf

次の正規表現を使用しています。

.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+

これにより、各行が正しく一致しますが、新しい行に続くメッセージの部分が除外されます。しかし、シングルライン モードをオンにすると、一致するものは 1 つだけ (最初のもの) で、他のすべてのエントリが含まれます。

誰かが私を正しい方向に向けることができますか?

ありがとう :)

4

2 に答える 2

1

サンプルテキストファイルから、いくつかの空白行があるように見えます。それでよければ、この正規表現を使用できるはずです。

^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)+

それが単なる間違いであり、空白行が不要な場合は、最後+*次のように置き換えます。

^(?:ERROR) \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - (?:(?!ERROR|INFO)(?:[a-z0-9A-Z ,:\-\t]*)\n)*

これはINFO行と一致しませんが、エラーのみが必要であると記述しました。他のメッセージ形式(WARNINGおそらく)がある場合は、それらをこの部分に含める必要があります。(?!ERROR|INFO)

正規表現に一致するグループがないため、一致しない(?:...)バリアントを使用しました。

于 2012-08-17T14:56:24.670 に答える
1

基本的に、このソリューションの背後にある考え方は、何を含めるかではなく、どこで停止するかを正規表現に伝えることです。

この正規表現は、正の先読みを使用して、正規表現の次の出現時 (または文字列全体の最後) で貪欲に停止します。

.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+?
     (?=(.{5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})|\z)

これには、前のエラー メッセージの一部として INFO 行も含まれます。少しバグがあるように聞こえるので、INFO 行を単一のエラー メッセージ (前のエラー メッセージの一部ではない) と見なしたい場合は、代わりにこの正規表現を使用することを検討してください。

.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} - .+?
(?=.{4,5} \d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})
于 2012-08-17T14:47:03.200 に答える