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 相同的正则表达式引擎
主线任务 完整查找所有 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 相同的正则表达式引擎