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

人气:56 发布:2023-01-03 标签: regex .net c# negative-lookahead

问题描述

我正在尝试使用以下正则表达式解析C#应用程序中的日志条目:(^[0-9]{4}(-[0-9]{2}){2}([^|]+|){3})(?!1)for日志格式类似于[日期(以某种格式)]|[级别]|[appname]|[Message]。

在哪里(我想):

^匹配行首(在regex101上启用/gm) [0-9]{4}(-[0-9]{2}){2}后跟日期开头,如2015-03-03 ([^|]+|){3})后跟剩余日期、日志级别和应用程序名称 (?!1)后跟NOT新日志条目的开始(应该是消息)

例如,我有以下4日志条目(为便于说明,用换行符分隔):

2015-03-03 19:30:47.2725|INFO|MyApp|This is a single line log message.

2015-03-03 19:31:29.1209|INFO|MyApp|This log message has multiple
lines with
2015-03-03
a date in it.

2015-03-03 19:32:50.1106|INFO|MyApp|This log message has
multiple lines
but just text only.

2015-03-03 19:33:20.2683|ERROR|MyApp|This log message has multiple lines but
also some confusing text like
2015-03-03 19:33:20.2683|ERROR| which should
still be a valid log message.

但当我在regex101上测试正则表达式时,它没有捕获消息,可能是因为我不了解如何捕获负向先行。

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

那么我如何捕获(多行)邮件?

推荐答案

您可以使用此正则表达式:

(^d{4}(-d{2}){2}([^|]+|){3})([sS]*?)
*(?=^d{4}.*?(?:[^|
]+|){3}|z)

RegEx Demo

此正则表达式在C#中也应该有效,只需确保使用MULTILINE标志即可。

19