我的RegEx在匹配日志消息时遇到问题。我们使用的是log 4 net,我想按 * 时间戳 、 级别 、 日志记录器 * 和 * 消息 * 分组。问题是我们使用分号分隔这些组,有时消息也包含分号。
日志文件中的条目示例:
2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Waiting X to continue
(工作)2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Framework;<METADATA>Waiting X to continue</METADATA>
(不工作)
RegEx链接:- https://regex101.com/r/E97VkI/1(工作)
- https://regex101.com/r/n6Um82/1(不工作)
如您所见,第二个链接将“/METADATA>”分组为消息。
问题是我不知道 message 中有多少个分号。但是,我知道在 logger 中可以有1-3个分号。是否可以编写一个RegEx来匹配/忽略最多3个分号?
正如您在下面的示例中所看到的,logger 将以分号开头和结尾,如下所示:;Request.Apply.Locked;business.Validator;Framework;Test;
这里我们有5个分号,但其中3个应该是 logger 组的一部分。
日志的长度可以为:2023-02-24 10:06:41,903;WARN;Request.Apply.Locked;business.Validator;Framework;Test;<METADATA>Waiting X to continue</METADATA>
以下是我当前的RegEx:(?<timestamp>[\d-]+ [\d:,]+);(?<level>[A-Z]+)\s?;?\s?\s?(?<logger>[\s\S]*);(?<message>[\s\S]*)
**总结一下:**我想让一个RegEx对 timestamp、level、logger、message 进行分组,它应该对示例1和示例2都有效。
先谢了。
2条答案
按热度按时间qlvxas9a1#
您可以使用量词和取反字符类匹配前导
;
,然后在其间匹配0 - 2个匹配项,最后匹配结尾;
:(?<timestamp>[\d-]+ [\d:,]+);
组 * 时间戳 *(?<level>[A-Z]+)
组 * 级别 * 匹配1+字符A-Z\s*;\s*
在可选空白字符之间匹配;
(您也可以匹配换行符)(?<logger>
组 * 记录器 *(?:[^;\n]*;){0,2}
对除;
以外的任何字符重复0 - 2次,然后匹配;
[^;\n]*
匹配除;
或换行符以外的可选字符);
关闭组 * 记录器 * 并匹配;
(?<message>.*)
与该行其余部分匹配的组 * 消息 *参见regex demo。
或者,如果
<
不应是记录器的一部分:查看其他regex demo
soat7uwm2#
尝试使用
m
正则表达式修饰符来匹配行首和行尾的^
和$
,然后在最后一个捕获中查找任何内容,* 除了 * 分号。它适用于上述示例1和2。