2016-10-28 3 views
2

RegexSerDeを使用して正規表現でWebログを解析しようとしています。各正規表現グループをテーブル内のカラムと照合して動作し、正規表現グループが空であればそのカラムにヌルを割り当てます。正規表現を使用してログファイルの行を一致させる場合のオプションフィールド

ログ行が不足しているフィールドと一致するのに問題があります。このログ内の行の2種類があります

<134>2016-10-23T23:59:59Z cache-iad2134 fastly[502801]: 52.55.94.131 "-" "-" Sun, 23 Oct 2016 23:59:59 GMT GET /apps/events/2016/10/11/3062653/?REC_ID=3062653&id=0 200 

<134>2016-10-23T23:59:59Z cache-dfw1835 fastly[502801]: 1477267199 

は、私はすべてのフィールドを持つ行の最初の型と一致する正規表現の下に書いている:

^(\\S+) (\\S+) (\\S+) (\\S+) "(\\S+)" "(\\S+)" (.*) (\\d{3}) 

しかし、私は正規表現を取得するために?で遊ん最初の4の後にフィールドを無視してもかまいませんが、列をつぶしてしまいました。

グループの数を変更せずに?を追加する方法についての提案(デシリアライザが咳をしないように)またはこれを行うための他の方法をお勧めしますか?

+0

オプション修飾子を使用して正規表現を表示していないので、間違ったことを教えてください。私が考えることができるのは、フィールド間のスペースをオプションとしても忘れてしまったことだけです。 – Barmar

答えて

1

最初の4の後のすべてのフィールドに非キャプチャグループを置き、オプションにします。グループの先頭に?:を置く

^(\\S+) (\\S+) (\\S+) (\\S+)(?: "(\\S+)" "(\\S+)" (.*) (\\d{3}))? 

は、それ以外の撮影になります。したがって、このグループはキャプチャされるグループの数には影響しません。

+0

ありがとうBarmar。それは魅力のように働いた。私は本当にあなたの助けに感謝します。 –

関連する問題