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

(regex) How do I capture all data between brackets when one event log contains 5 fields and the other contains 6?

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

[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>.*)

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

\[(?<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 的匹配)。

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

此正则表达式似乎适合您的情况。我已经用 pcre 和你的两个样本输入对其进行了测试。

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