2016-10-28 30 views
2

我想用正則表達式使用RegexSerDe解析網絡日誌。它通過將每個正則表達式組與表中的一列進行匹配來工作,如果正則表達式組爲空,則向該列分配一個空值。使用正則表達式匹配日誌文件行時的可選字段

我在匹配缺少字段的日誌行時遇到問題。有兩種排在該日誌:

<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。這就像一個魅力。我非常感謝你的幫助。 –