(正则表达式)当一个事件日志包含 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
我尝试正确解析以下日志:
[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