我想解析一个看起来像这样的日志文件,从每个日志条目中捕获日期和消息:
[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
作为信息。
如何让第二个捕获组继续跨越线边界直到下一个匹配?
答案 0 :(得分:1)
此答案允许[
和]
出现在日志信息字符串中(只要它不是该行中的第一个字符)。
^\[([^\]]*)\]([\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/