【发布时间】:2015-03-04 20:14:57
【问题描述】:
我正在尝试使用此正则表达式解析 C# 应用程序中的日志条目:(^[0-9]{4}(-[0-9]{2}){2}([^|]+\|){3})(?!\1) 用于格式为 [日期(某种格式)] 的日志 | [等级] | [应用名称] | [消息].
在哪里(我认为):
-
^匹配行首(在 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|ERROR|MyApp|此日志消息有多行但 还有一些令人困惑的文字,例如 2015-03-03 19:33:20.2683|错误|这应该 仍然是有效的日志消息。但是当我在regex101 上测试它时,正则表达式没有捕获该消息,可能是因为我不明白如何捕获负前瞻。
如果我在正则表达式中包含.*:
(^[0-9]{4}(-[0-9]{2}){2}([^|]+\|){3}).*(?!\1) 它匹配消息,但只匹配一行(因为 . 不匹配换行符)。
那么我怎样才能捕获(多行)消息?
【问题讨论】:
-
您在这里使用什么语言?有几种不同类型的正则表达式,具体取决于环境,所以请具体说明。
-
@phillip 我想在 C# 应用程序中使用它,但我首先尝试使用 regex101 的默认 PHP 风格使其工作。
标签: c# .net regex negative-lookahead