正则表达式捕获组跳过转义字符串

Regex Capture group skip escaped strings

我目前正在使用 Splunk 来检查我的一些日志,并且我 运行 解决了一些正则表达式问题。现在我有几种不同格式的日志。当我构建正则表达式时,我将 JsonConvert.Serialize() 转储到我的日志中,这只会转储我的对象的 json 版本,效果很好。但是现在我只转储文本,我似乎无法将正则表达式与我的捕获组匹配。

\{\"line\":\"(?<time>.+)\|(?<log_level>.+)\|(?<Controller>.+)\|(?<Message>.+)\}\"

我当前的正则表达式在上面,它与前两个匹配。注意它是如何以花括号

结尾的
{"line":"18:48:17.990|INFO|PController|Plex event is media.pause}","source":"stdout","tag":"4e263fa2001d"}

{"line":"22:38:47.839|INFO|PController|{\"Id\":\"SMf1bc2466b1\",\"ErrorMessages\":null}","source":"stdout","tag":"b5fcd8b8b5a4"}

{"line":"22:38:47.839|INFO|PController|This is another test","source":"stdout","tag":"b5fcd8b8b5a4"}

{"line":"18:56:37.212|INFO|PController|media.stop","source":"stdout","tag":"4e263fa2001d"}

基本上,正则表达式应该从日志中解析 json 并将字段拉出到指定的捕获组中。它适用于日志 #1 和日志 #2,但它在日志 #3 和日志 #4 上失败,因为它没有结束大括号。

我也试过了

\{\"line\":\"(?<time>.+)\|(?<log_level>.+)\|(?<Controller>.+)\|(?<Message>.+)\"\,

但这匹配到 "source":"stdout" 的末尾,而不是我的行标记的末尾。

我正在尝试启用“消息”捕获组以包含任何可能的字符,包括引号、大括号和基本上任何特殊字符。我只是想从完整的 Json 字符串中提取时间、日志级别、控制器和消息。

如果我没理解错的话,您的“消息”组可以包含带附加引号的大括号,也可以不包含大括号。
然后,您必须检查正则表达式中的两种可能性:

\{\"line\":\"(?<time>.+)\|(?<log_level>.+)\|(?<Controller>.+)\|(?<Message>.+\}|.+?)\"

请注意,在没有大括号的情况下,我们使用 ? 以便在下一个引号处停止(惰性表达式而不是贪婪表达式)
Demo