c#,通过正则表达式请求查找多行消息

c#, find multiline message by regex request

主线任务 完整查找所有 DEBUG 消息和 select 消息(无论是单行消息还是未知长度的多行消息)

我写了这样的正则表达式代码:

\d{13}\t.*DEBUG.*(?=\d{13})

它的搜索完美,但只有单行消息

我也试过这样的代码:

string myReg1 = @"\d{13}\t.*DEBUG.*(?=\d{13})";
            MatchCollection match1 = Regex.Matches(logData, myReg1, RegexOptions.Singleline);

但是这段代码只找到了一个 mach,其中必须有 147 个匹配....

我有这样的日志:

1426174736798   addons.manager  DEBUG   Registering shutdown blocker for OpenH264Provider

1426174736799   addons.manager  DEBUG   Registering shutdown blocker for PluginProvider
*** Blocklist::_preloadBlocklistFile: blocklist is disabled

尝试改用这个非贪婪正则表达式(编辑:针对输入稍作调整):

\d{13}\t.{0,100}DEBUG.+?(?=\d{13}|$)

现在调整得更接近您的输入数据。我真的想不出一个理想的方法来防止 DEBUG 之前的第一个点吃掉你不想要的其他行。在一个完美的世界中,你可以写一个短语来表达类似 "any character except a row of 13 digits" 的意思,但这并不是正则表达式擅长的事情。也许其他人可以做得更好。同时,我限制第一个点不超过 100 个字符。如果超过 13 位数字超过 100 个字符并且还没有找到字符串 "DEBUG",则可以相当安全地假设它在我们不关心的一行上。您可能需要稍微向上或向下调整此数字以适合您的数据(我讨厌这样不完美的解决方案),但希望这会让您在附近。

.* 更改为 .+? 使点非贪婪。我还在最后一个非捕获组中添加了一个 or 和一个 $ 以匹配行尾(RegexOptions.SingleLine 会将整个输入视为一行)以确保您的最后一个记录被捕获,因为它的末尾后面没有 13 位数字。

这似乎在 Expresso 中正常工作,它使用与 .NET 相同的正则表达式引擎