使用正则表达式解析多行日志条目

Kap*_*apé 5 .net c# regex regex-lookarounds

我正在尝试使用此正则表达式解析 C# 应用程序中的日志条目:(^[0-9]{4}(-[0-9]{2}){2}([^|]+\|){3})(?!\1)对于格式类似于[date (in some format)] |的日志 [等级] | [应用程序名称] | [信息]

哪里(我认为):

  • ^匹配行的开头(在 regex101 上启用/gm
  • [0-9]{4}(-[0-9]{2}){2}接下来是日期的开始,例如 2015-03-03
  • ([^|]+\|){3})接下来是日期的其余部分、日志级别和应用程序名称
  • (?!\1)后面跟着的不是新日志条目的开始(应该是消息)

例如,我有以下4 个日志条目(为了清楚起见,用换行符分隔):

2015-03-03 19:30:47.2725|INFO|MyApp|这是一条单行日志消息。

2015-03-03 19:31:29.1209|INFO|MyApp|此日志消息有多个
线与
2015-03-03
里面有一个日期。

2015-03-03 19:32:50.1106|INFO|MyApp|此日志消息有
多行
但只是文本。

2015-03-03 19:33:20.2683|错误|MyApp|此日志消息有多行,但是
还有一些令人困惑的文字,例如
2015-03-03 19:33:20.2683|错误| 哪个应该
仍然是有效的日志消息。

但是当我在regex101上测试它时,正则表达式没有捕获该消息,可能是因为我不明白如何捕获否定前瞻。

.*如果我在正则表达式中 包含:(^[0-9]{4}(-[0-9]{2}){2}([^|]+\|){3}).*(?!\1)它与消息匹配,但仅匹配一行(因为与.换行符不匹配)。

那么如何捕获(多行)消息呢?

anu*_*ava 3

您可以使用这个正则表达式:

(^\d{4}(-\d{2}){2}([^|]+\|){3})([\s\S]*?)\n*(?=^\d{4}.*?(?:[^|\n]+\|){3}|\z)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

这个正则表达式也应该在 C# 中工作,只需确保使用MULTILINE标志即可。