RegEx随后使用特定文本捕获执行时间

时间:2013-03-04 17:40:49

标签: c# .net regex regex-lookarounds

我有我要解析的跟踪日志文件。我使用正则表达式来收集我需要的信息并完成大部分工作。我有一个日志文件的某个部分,根据执行的步骤重复多次。我可以使用以下正则表达式,然后返回捕获数组,但步骤的顺序可能会更改。我希望能够有所保证地抓住具体步骤。

RegEx:

\[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] [管理员] [(null)] [14]
  02/19 00:48:46:762 [INFO] [MigrationWizard] [Step 1 Done。] [管理员] [(null)] [14]

我是否需要使用前瞻断言来确保总执行时间后跟一个特定的步骤名称?如何计算中间的所有字符?如何计算多行换行?我正在使用C#。

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式

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

当然,需要根据您想要匹配的步骤更改“步骤1”。这只会匹配“步骤1”的总执行时间。

确保未启用单行模式(因此。换行符不相符。)

我假设日志条目的顺序始终相同。

答案 1 :(得分: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

答案 2 :(得分:0)

你的正则表达式

 \[Total execution Time: (.+) min

效率低,因为.+会在回溯之前尽可能多地匹配任何字符(换行符除外),以尝试匹配跟随它的" min"。最好是.+?,它会在" min"之前匹配尽可能少的字符,最好再次匹配数字和点[\d.]+或匹配特定格式{{1} }。

无论如何,为了获得\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匹配换行符。

或者,您可以将模式放在.之前的正面后视中,然后将模式放在正面前瞻中,避免需要使用捕获组来获取值,但是对任何事情都没什么影响。