正则表达式匹配如果字符串包含新行或如果它不包含(多行)



我试图解析日志文件,其中一些是单行日志,有些是多行。我的正则表达式可以很好地处理单行,但不能处理多行。

^(?<timestamp>d+-d+-d+Td+:d+:d+.d+(+|-)d+:d+)s+[(?<severity>w+)](?<message>.*)$

这是匹配失败的地方,因为它没有检测到新行之后的字符串。

2022-06-27T15:22:35.508+00:00 [Info] New settings received:
{"indexer.settings.compaction.days_of_week":"Sunday,Monday"}

新行应该包含在"message"分组,直到检测到新的时间戳。

我尝试了多种方法来包含要匹配的换行符,但没有找到任何解决方案。我已经粘贴了两种日志格式的链接:https://regex101.com/r/ftJ3UZ/1.

如果支持向前看,可以在message组中放置一个可选的重复组,检查下一行不是以类似日期的模式开始的,或者完整的时间戳。

^(?<timestamp>d+-d+-d+Td+:d+:d+.d+([+-])d+:d+)s+[(?<severity>w+)](?<message>.*(?:n(?!d+-d+-d+T).*)*)$

Regex演示

似乎这将匹配:

^(?<timestamp>d+-d+-d+Td+:d+:d+.d+(+|-)d+:d+)s+[(?<severity>w+)](?<message>.*)n(?:{.*})?

我已经删除了$并在末尾添加了n(?:{.*})?,以便能够匹配{}括号内的可选部分。

最新更新