繁体   English   中英

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

[英]c#, find multiline message by regex request

主要任务查找所有调试消息并完全选择消息(无论是单行消息还是长度未知的多行)

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

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

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

我也尝试过这样的代码:

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

但是这段代码只找到一个马赫,必须有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之前的第一个点不会耗尽您不需要的其他行。 在一个完美的世界中,您可以写一个短语来表达诸如“除一行13位数字之外的任何字符”之类的字词,但这并不是regex确实能很好地完成的事情。 也许别人可以做得更好。 同时,我将第一个点限制为不超过100个字符。 如果它在13位数字后超过100个字符,并且尚未找到字符串“ DEBUG”,则可以很安全地假定它位于我们不关心的行上。 您可能需要向上或向下调整此数字以适合您的数据(我讨厌这样不完善的解决方案),但是希望这能带您到附近。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM