RegEx用于捕获执行时间,然后使用特定的文本
本文关键字:文本 然后 用于 执行时间 RegEx | 更新日期: 2023-09-27 18:02:03
我有下面的日志文件,我试图解析。我使用正则表达式来收集我需要的信息,并完成了大部分工作。根据执行的步骤,日志文件的某一部分会重复几次。我可以使用下面的正则表达式,然后返回捕获数组,但是步骤的顺序可能会改变。我希望能够有把握地捕捉到具体的步骤。
正则表达式:
'[Total execution Time: (.+) min
日志摘录:
02/19 00:48:46:762 [INFO] [MigrationWizard][总执行时间:11.05 min (s)] [administrator] [(null)] [14]
[INFO] [MigrationWizard] [Total number of error(s): 0] [administrator] [(null)] [14]
[INFO] [MigrationWizard][步骤1完成][(null)] [14]
是否需要使用前瞻性断言来确保总执行时间后跟特定的步骤名称?我该如何解释中间的所有字符呢?我如何解释多行换行?我用的是c#
试试这个正则表达式
Total execution Time: (['d.]+).*'r?'n.*'r?'n.*'[Step 1's
其中"Step 1"当然需要更改为您希望匹配的步骤。这将只匹配"Step 1"的总执行时间。
请确保单行模式未启用(因此。不匹配换行符)
我假设日志条目的顺序总是相同的
试试这样:
string strRegex = @"(Total execution Time: )('d{2}['.:]'d{2})'s+";
RegexOptions myRegexOptions = RegexOptions.Multiline | RegexOptions.Singleline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"..............";
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
if (myMatch.Success)
{
// ........ do something
}
}
输入字符串:
02/19 00:48:46:762 [INFO ] [MigrationWizard] [Total execution Time: 11.05 minute(s)] [administrator] [(null)] [14]
02/19 00:48:46:762 [INFO ] [MigrationWizard] [Total number of error(s): 0] [administrator] [(null)] [14]
02/19 00:48:46:762 [INFO ] [MigrationWizard] [Step 1 Done.] [administrator] [(null)] [14]
02/19 00:48:46:762 [INFO ] [MigrationWizard] [Total execution Time: 13:25 minute(s)] [administrator] [(null)] [14]
匹配:Total execution Time: 11.05
Total execution Time: 13:25
您的正则表达式
'[Total execution Time: (.+) min
是低效的,因为.+
在回溯之前会尽可能多地贪婪地匹配任何字符(换行符除外),以尝试匹配它后面的" min"
。更好的是.+?
,它将在" min"
之前匹配尽可能少的字符,更好的是只匹配数字和点['d.]+
或匹配特定格式'd'd'.'d'd
。
[Step 1
是它的下一个步骤时的执行时间,您可以使用,例如
Match m = Regex.Match(str,
@"'[Total execution Time: (['d.]+)(?:(?!'[Step ).)+'[Step 1 Done",
RegexOptions.Singleline
);
if (m.Success) {
Console.WriteLine(m.Groups[1].Value);
}
负正向查找(?!'[Step )
意味着.
将只匹配直到"[Step "
出现在字符串中的字符。如果整个匹配成功,则必须匹配"[Step 1 Done"
。
RegexOptions.Singleline
,以便.
跨换行匹配。
或者,您可以将模式放在['d.]+
前面的正向后查找中,将模式放在它后面的正向前查找中,从而避免使用捕获组来获取值,但是这对任何事情都没有什么区别。