.NET REGEX:使用多行条目拆分日志



我想解析一个看起来像这样的日志文件,从每个日志条目中捕获日期和消息:

[12/18/2017 1:22:12 PM] LOG FILE STREAM STARTED - v2.1.6561.24062, BUILD 12/18/2017 1:22:04 PM
[12/18/2017 1:22:17 PM]  Network Configuration Changed: Current status of all interfaces:
 - Ethernet 2 is DOWN - self-assigned IP
[12/18/2017 1:22:29 PM]  Network Configuration Changed: Current status of all interfaces:
 - Ethernet 2  is UP - IP address = 172.16.10.191

如果每个条目都是一行,则可以很容易地使用^([.+])s+(.*)。但是,某些条目跨越多行 - 例如,对于我想捕获所有

1:22:17 PM条目
Network Configuration Changed: Current status of all interfaces:
 - Ethernet 2 is DOWN - self-assigned IP

作为消息。

如何使第二个捕获组继续跨线边界,直到下一场比赛?

简介

此答案允许在日志信息字符串中存在[](只要它不是行中的第一个字符)。


代码

请参阅此处使用的正则

^[([^]]*)]([sS]*?(?=^[|z))

NOTE :上述正则使用Multiline标志。

可选,您也可以在添加另一个标志Singleline

的情况下使用^[([^]]*)](.*?(?=^[|z))

说明

  • ^在线开始时断言位置
  • [匹配左方方括号[字面上
  • ([^]]*)捕获除 ]以外的任何字符,
  • ]匹配右方方括号]字面上
  • ([sS]*?(?=^[|z))将以下捕获到捕获组2
    • [sS]*?匹配任何次数的任何次数(但尽可能少)
    • (?=^[|z)积极的lookahead确保以下任何一场比赛
      • ^[在新行开始时匹配 [(字面上)
      • z在字符串的绝对末端断言位置

他是我用您给定的文本测试的一个: ([.+])s+([^[]+)。第二组将匹配任何不是[至少1次的角色,并且由于您的日志始终以[开头,它给出了想要的结果。

REGEX101示例:https://regex101.com/r/bzg3xp/1/