2013-03-04 30 views
2

我有我想解析的後續日誌文件。我使用正則表達式來收集我需要的信息,並完成了大部分工作。根據執行的步驟,我有一部分重複的日誌文件。我可以使用下面的正則表達式,然後返回捕獲數組,但是這些步驟的順序可能會改變。我希望能夠通過一些保證來捕捉具體的步驟。正則表達式捕獲執行時間後的特定文本

正則表達式:

\[Total execution Time: (.+) min 

日誌摘要:

02/19 00:48:46:762 [INFO] [MigrationWizard] [總執行時間:11.05分鐘(S)] [管理員] [(null)] [14]
02/19 00:48:46:762 [INFO] [MigrationWizard] [錯誤總數:0] [管理員] [(null)] [14]
02/19 00:48:46:762 [INFO] [MigrationWizard] [Step 1 Done。] [administrator] [(null)] [14]

我是否需要使用前瞻斷言來確保總執行時間後面是特定的步驟名稱?我如何解釋中間的所有字符?我如何計算多行換行?我正在使用C#。

+0

日誌摘錄中的三行總是與日誌的其餘部分相似嗎?換句話說,這個步驟的執行時間總是跟着後面兩行的名字? – 2013-03-04 18:37:13

回答

1

試試這個正則表達式

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

當你需要匹配的步驟當然需要改變「步驟1」。這隻會匹配「步驟1」的總執行時間。

讓未啓用肯定單線模式(所以,整個換行不匹配)

我假設日誌條目的順序總是相同的。

+0

這樣做。看看正則表達式,它看起來像是在總執行時間之後匹配一定數量的回車。我沒有想到這一點。這可能是我嘗試過的任何東西都失敗的原因。謝謝! – PBMax 2013-03-04 19:49:08

+1

因爲您沒有使用'^'或'$',所以不需要多行模式 - 也許您的意思是:確保單行模式不啓用(所以'.'不會跨換行符匹配)。還要注意,這將匹配'步驟10','步驟11'等,除非你的正則表達式包含尾部空格。 – MikeM 2013-03-04 20:16:54

+0

編輯的答案包括您的更正 – 2013-03-05 07:22:52

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 
+0

我不想遍歷捕獲組,因爲可以省略步驟。在這些情況下,輸出將列出錯誤步驟的步驟值。我將輸出格式設置爲「步驟1:11.05分鐘」 – PBMax 2013-03-04 19:53:17

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.]+前的模式在正面看,後面跟隨它以一種積極先行的模式,避免了需要使用捕獲組獲得的價值,但它會使小與任何事物不同。

+0

比需要更復雜一點 – 2013-03-04 21:36:31