[英]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.