2016-06-22 4 views
1

私は正しく解析しようとしています以下のログがあります。(正規表現)1つのイベントログに5つのフィールドがあり、もう一方のフィールドに6が含まれている場合は、角括弧で囲まれたすべてのデータをキャプチャするにはどうすればよいですか?

[groupA] [groupB] [groupC] [groupD] [groupE] messsage 

[groupA] [groupB] [groupC] [groupD] [groupE] [groupF] messsage

イベントの一部が5つの括弧のフィールドと1つのメッセージを持っている、およびログの他のセットが6つの括弧のフィールドが含まれていると1をメッセージ。

角かっこ内の各フィールドをキャプチャ(および名前付け)するにはどうすればよいですか?私は最初のレイアウトをキャプチャし、次の正規表現を持っているし、私はOR行う(|)第2のレイアウトをキャプチャ:

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s(?<message>.*)|\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s\[(?<E>.+?)\]\s(?<message>.*) 

答えて

0

あなたはこのようなオプションのグループを使用することができます。

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\] 
    \s\[(?<A>.+?)] 
    \s\[(?<B>.+?)] 
    \s\[(?<C>.+?)] 
    \s\[(?<D>.+?)] 
    (?:\s\[(?<E>.+?)])? # HERE 
\s(?<message>.*) 

を参照してください。 regex demo(私は、を\sとのマッチングから除外するために、複数行のデモで\hを使用しました)。

また、空の値を許可するには、.+?.*?に置き換えます。 [...]の値に]または[が含まれていない場合は、\[(.+?)]をすべて\[([^][]*)]に置き換えることをおすすめします。

+0

これは機能しました。どうもありがとうございました。私はオプションのグループを使ったことは一度もありません。 – user3002

0

この正規表現はあなたの状況に適しているようです。私はpcreとあなたの2つのサンプル入力でそれをテストしました。

/\[([a-zA-Z]+)+\]|([a-zA-Z]+)/g 
関連する問題