我想解析一个看起来像这样的日志文件,从每个日志条目中捕获日期和消息:
[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/