使用正则表达式匹配日志文件行时的可选字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用正则表达式匹配日志文件行时的可选字段相关的知识,希望对你有一定的参考价值。

我正在尝试使用RegexSerDe解析带有正则表达式的Web日志。它的工作原理是将每个正则表达式组与表中的列匹配,如果正则表达式组为空,则为该列分配空值。

我在匹配缺少字段的日志行时遇到问题。此日志中有两种行:

<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个字段后面的所有字段周围放置一个非捕获组,并使其成为可选项。

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

?:放在组的开头使其无法捕获。因此,该组不会影响捕获的组数。

以上是关于使用正则表达式匹配日志文件行时的可选字段的主要内容,如果未能解决你的问题,请参考以下文章

匹配所有出现的可选前缀/后缀[重复]

正则表达式 C# - 中间的可选组

c# 正则表达式捕获

可选文件扩展名的正则表达式匹配

在正则表达式的可选部分中捕获的组

为啥正则表达式可选非捕获组不作为可选并且搞砸匹配?