使用regex匹配日志文件行时的可选字段

vd8tlhqk  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(365)

我正在尝试使用regexserde解析带有正则表达式的web日志。它的工作原理是将每个regex组与表中的一列相匹配,如果regex组为空,则为该列指定null。
我在匹配缺少字段的日志行时遇到问题。此日志中有两种类型的行:

<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个字段之后的字段,但会不断弄乱列。
关于如何添加 ? 不改变组的数量(这样反序列化程序就不会出现问题了)?或者你建议的其他方法?

x7rlezfr

x7rlezfr1#

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

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

?: 在一个组开始时,使其不被捕获。所以这个组不会影响被捕获的组的数量。

相关问题