我想解析一个看起来像这样的日志文件,从每个日志条目中捕获日期和消息:
[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
作为消息。
如何使第二个捕获组继续跨越线边界直到下一个匹配?
这个答案允许[
和]
出现在日志信息字符串中(只要它不是行中的第一个字符)。
^\[([^\]]*)\]([\s\S]*?(?=^\[|\z))
注意:上面的正则表达式使用Multiline
标志。
或者,您也可以使用^\[(\[^\]\]*)\](.*?(?=^\[|\z))
with the addition of another flag Singleline
^
在线的开头断言位置\[
字面上匹配左方括号[
([^\]]*)
捕捉除]
之外的任何角色任意次数到捕获组1\]
从字面上匹配正确的方括号]
([\s\S]*?(?=^\[|\z))
将以下内容捕获到捕获组2中
[\s\S]*?
任意次数匹配任何字符(但尽可能少)
(?=^\[|\z)
肯定前瞻确保以下任何一种匹配
^\[
在新线的开头匹配[
(字面意思)
\z
在字符串的绝对末尾断言位置他是我用你给定的文本测试过的:(\[.+\])\s+([^[]+)
。第二组将匹配任何不是[
的角色至少1次,因为你的日志总是以[
开头,它给出想要的结果。
Regex101示例:https://regex101.com/r/Bzg3xp/1/