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

时间:2017-12-18 21:36:17

标签: .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

作为信息。

如何让第二个捕获组继续跨越线边界直到下一个匹配?

2 个答案:

答案 0 :(得分:1)

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

代码

See regex in use here

^\[([^\]]*)\]([\s\S]*?(?=^\[|\z))

注意:上述正则表达式使用Multiline标记。

或者,您也可以使用^\[(\[^\]\]*)\](.*?(?=^\[|\z)) with the addition of another flag Singleline

说明

  • ^在行首处断言位置
  • \[字面上匹配左方括号[
  • ([^\]]*)]\]之外的任何字符捕获到捕获组1
  • ]字面上匹配右方括号([\s\S]*?(?=^\[|\z))
  • [\s\S]*?将以下内容捕获到捕获组2中
    • (?=^\[|\z)任意次数匹配任何字符(但尽可能少)
    • ^\[肯定前瞻确保以下任一匹配
      • [在新行的开头匹配\z(字面意思)
      • MessageType.NETWORK.toString()在字符串的绝对末尾断言位置

答案 1 :(得分:0)

他是用我给定的文字测试过的:(\[.+\])\s+([^[]+)。第二组将匹配任何不是[至少1次的字符,并且由于您的日志始终以[开头,因此它会提供所需的结果。

Regex101示例:https://regex101.com/r/Bzg3xp/1/