(正则表达式)当一个事件日志包含5个字段而另一个包含6个字段时,如何捕获括号中的所有数据?

时间:2016-06-22 16:22:41

标签: regex pcre

我正在尝试正确解析以下日志:

[groupA] [groupB] [groupC] [groupD] [groupE] messsage

[groupA] [groupB] [groupC] [groupD] [groupE] [groupF] messsage

某些事件有5个括号内的字段和1个消息,另一组日志包含6个括号内的字段和1个消息。

如何捕捉(和命名)括号内的每个字段?我有以下正则表达式捕获第一个布局,然后我做一个OR(|)捕获第二个布局:

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s(?<message>.*)|\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]\s\[(?<A>.+?)\]\s\[(?<B>.+?)\]\s\[(?<C>.+?)\]\s\[(?<D>.+?)\]\s\[(?<E>.+?)\]\s(?<message>.*)

2 个答案:

答案 0 :(得分:0)

您可以使用这样的可选组:

\[(?<timestamp>\d{4}-\d{2}-\d{2}\s\d{2}\:\d{2}\:\d{2}\,\d{3})\]
  \s\[(?<A>.+?)]
  \s\[(?<B>.+?)]
  \s\[(?<C>.+?)]
  \s\[(?<D>.+?)]
  (?:\s\[(?<E>.+?)])? # HERE
\s(?<message>.*)

请参阅多行演示中的regex demo(我使用了\h,以排除\n\s的匹配。)

另外,要允许空值,请将.+?替换为.*?。如果[...]中的值不包含][,我建议将所有\[(.+?)]替换为\[([^][]*)]

答案 1 :(得分:0)

这个正则表达式适合你的情况。我用pcre和你的两个样本输入进行了测试。

/\[([a-zA-Z]+)+\]|([a-zA-Z]+)/g