我正在尝试正确解析以下日志:
[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>.*)
答案 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