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 个之后的字段,但一直弄乱列。

关于如何在?不改变组数的情况下添加的任何建议(以便反序列化器不会咳出)?或者您会建议任何其他方式来做到这一点?

4

1 回答 1

1

在前 4 个之后的所有字段周围放置一个非捕获组,并将其设为可选。

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

放在?:组的开头使其无法捕获。所以这个组不会影响捕获的组数。

于 2016-10-28T01:30:29.193 回答