2011-03-28 19 views
1

私のログファイルには、開始と終了のマーカーが記録されています。正規表現のヘルプが必要

WY_LOG_TYPE_ERROR < < **
以下のようにこれは
何とか最初のエラーである - 何とか - 何とか
** >>

WY_LOG_TYPE_ERROR < < **
これは
何とか2番目のエラーです - blah - blah
** >>

WY_LOG_TYPE_ER 3上記のエントリがログファイルに存在していると言うどの時点でも何とか
** >>

- 何とか - ROR < < **
これは、第三エラー
何とかです。
正規表現を最後のエントリだけと一致させたい。

現時点では、私は以下のREG-EXPを使用しています:
WY_LOG_TYPE_ERROR \ sの* < < \ * \ *((| \ n)で*。)\ * \ * >> $

今$ 1が含まれています最初のエントリの開始マーカーと最後のエントリの終了マーカーの間のすべてのもの。
私が望むのは、最後のエントリの開始マーカーと終了マーカーの間のコンテンツです。私は他のエントリーには関心がありません。

誰も私のニーズに合わせてこのreg-expを修正してください。

編集:私はperlのREG-EX

Editを使用しています:私は、エラー・ログ処理のためSECを使用していますように私は、REG-EXPを使用する必要があります。

答えて

1

"貪欲でない"マッチを行う必要があります。 *はデフォルトでは貪欲です。つまり、可能な限り一致します。ほとんどの言語は*?を使用して、貪欲でない、または可能な限り最短の一致を意味します。

0

ファイルの末尾に一致するようにregex to match EOFとして\zを探している可能性があります。

WY_LOG_TYPE_ERROR\s*<<\*\*((.|\n))\\*>>\z 

(未テスト)

1

また、それが最後のログレコードだと主張する否定先読みを使用することができます。

m/WY_LOG_TYPE_ERROR <<\*\*(?!.*WY_LOG_TYPE_ERROR <<\*\*)(.*)\*\*>>/s 

まずあなたがレコードヘッダを見つけ、その後、あなたはそこだと主張このファイルにレコードヘッダーがなくなり、最後に$ 1に実際のメッセージをキャプチャします。

結果は以下のようになります。

This is the third error 
blah - blah - blah 

全体Perlは次のようになります。

あなたの文字列マッチングの大部分は単純な線形検索する場合、正規表現を使用する理由
if ($logfile =~ m/WY_LOG_TYPE_ERROR <<\*\*(?!.*WY_LOG_TYPE_ERROR <<\*\*)(.*)\*\*>>/s) { 
    $last_record = $1; 
} else { 
    $last_record = ""; 
} 
+0

今、私は以下のREG-EXPを使用しています(複数可?)ここで – Varun

2

これは

var log = "WY_LOG_TYPE_ERROR <<** ... **>>", 
    last = log.substr(log.lastIndexOf("WY_LOG_TYPE_ERROR")); 
(これは私が考えることができるのほぼすべての言語を実装するのは簡単だろうが)ちょうどJavaScriptでは、例えば WY_LOG_TYPE_ERROR

の最後の部分文字列検索を使用してはるかに簡単に解決することができます

どれくらい簡単でしたか? lastIndexOfは文字列の最後から始まり(任意の大きさのログ文字列/ファイル/ストリームに対応する)、状態マシンを構築する必要はありません(つまり、正規表現を作成する必要はありません)。 \ << WY_LOG_TYPE_ERROR \ sの*

#!/usr/bin/perl 
use strict; 
use warnings; 

my $err; 
while(<DATA>) { 
    $err ='' if (/^WY_LOG_TYPE_ERROR <</); 
    $err .= $_ if (/^WY_LOG_TYPE_ERROR <</ .. /^\*\*>>/); 
} 
print $err; 

__DATA__ 
WY_LOG_TYPE_ERROR <<** 
This is the first error 
blah - blah - blah 
**>> 

WY_LOG_TYPE_ERROR <<** 
This is the second error 
blah - blah - blah 
**>> 

WY_LOG_TYPE_ERROR <<** 
This is the third error 
blah - blah - blah 
**>> 

出力:::

WY_LOG_TYPE_ERROR <<** 
This is the third error 
blah - blah - blah 
**>> 
+0

私はこのアドバイスに+1以上を与えることができたらいいと思います。 –

+0

私は他の選択肢がありませんが、正規表現を使用しています。私は、ログ監視のためにSEC(http://simple-evcorr.sourceforge.net/man.html)を使用しています。 – Varun

0

はそれを行うための方法です* \ *(?!。* WY_LOG_TYPE_ERROR)(。*)\ * \ * >> $しかし、$ 1で3番目のエントリ全体を2回選択しています。何かご意見は?