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

问题描述 投票:-1回答:2

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

[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

作为消息。

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

.net regex
2个回答
1
投票

简要

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


See regex in use here

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

注意:上面的正则表达式使用Multiline标志。

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


说明

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

0
投票

他是我用你给定的文本测试过的:(\[.+\])\s+([^[]+)。第二组将匹配任何不是[的角色至少1次,因为你的日志总是以[开头,它给出想要的结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.