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#

RegEx用于捕获执行时间,然后使用特定的文本

试试这个正则表达式

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.]+前面的正向后查找中,将模式放在它后面的正向前查找中,从而避免使用捕获组来获取值,但是这对任何事情都没有什么区别。

相关文章: