2

我有我正在尝试解析的以下日志文​​件。我正在使用正则表达式来收集我需要的信息并完成了大部分工作。我有日志文件的某个部分根据它执行的步骤重复了几次。我可以使用以下正则表达式,然后返回捕获数组,但步骤的顺序可能会改变。我希望能够有把握地捕捉特定步骤。

正则表达式:

\[Total execution Time: (.+) min

日志摘录:

02/19 00:48:46:762 [INFO] [MigrationWizard] [总执行时间:11.05 分钟] [管理员] [(null)] [14]
02/19 00:48:46:762 [INFO ] [MigrationWizard] [错误总数:0] [administrator] [(null)] [14]
02/19 00:48:46:762 [INFO] [MigrationWizard] [Step 1 Done.] [administrator ] [(空)] [14]

我是否需要使用前瞻断言来确保总执行时间后跟特定的步骤名称?我如何解释介于两者之间的所有角色?我如何考虑多行馈送?我正在使用 C#。

4

3 回答 3

1

试试这个正则表达式

Total execution Time: ([\d.]+).*\r?\n.*\r?\n.*\[Step 1\s

其中“步骤 1”当然需要更改为您希望匹配的步骤。这只会匹配“步骤 1”的总执行时间。

确保未启用单行模式(因此 . 与换行符不匹配)

我假设日志条目的顺序总是相同的。

于 2013-03-04T18:52:03.483 回答
0

尝试这样的事情:

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
于 2013-03-04T18:35:50.173 回答
0

你的正则表达式

 \[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.]+正向的后视中,并将其后的模式放在正向的前瞻中,避免使用捕获组来获取值,但这对任何事情都没有什么影响。

于 2013-03-04T20:11:33.800 回答