2010-09-22 57 views
1

我解析日誌文件並嘗試匹配錯誤語句。我匹配的「錯誤CS」這一行的部分將應用於許多行,其中一些不重複。有沒有一種方法我不能返回重複項。使用正則表達式的味道的Java ..正則表達式在模式匹配時返回唯一行

例如:我簡單的regex返回

Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 
Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 

想它返回:

Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 
+1

您使用哪種語言,Java或C#? – NullUserException 2010-09-22 16:08:22

+0

參見:http://stackoverflow.com/questions/1863957/how-do-i-convert-an-array-of-strings-to-a-array-of-unique-values – kennytm 2010-09-22 16:11:55

+1

根據結構的錯誤日誌文件,您可能會丟棄正則表達式中的重複項。但是我建議你在比賽結束後這麼做,比如Kenny在他的鏈接 – NullUserException 2010-09-22 16:14:39

回答

2

從技術上來說,用正則表達式,這是不可能的。你需要更強大的東西。

正則表達式都是爲了匹配正規語言。您嘗試匹配的模式不規則。

你需要表達記住一些「狀態」,以前匹配的錯誤,正則表達式並不意味着處理這種類型的計算。 A Turing Machine能夠保存狀態。這更符合你所需要的內容。 (Java將很好地適應該法案。)

這可以相當容易地通過添加一些額外的邏輯到你的日誌分析器,你發現所有的錯誤行後解決。

2

一種解決方案是使用正則表達式的匹配,然後將行成一個數據結構就像一個set與你刪除重複的交易。在解析結束時,只需打印該組的內容。

如果你很在意命令你可以添加到地圖某種以線鍵和行號的值(也許是插入前的匹配項檢查)一個。如果按值排序,則會得到給定行的第一個實例的列表。

+1

正則表達式來識別,過濾數據結構。不同的工具提供不同的任務如果你是shell腳本,把它管到'|排序|例如uniq'(這會比你可以編程的東西使用更多的內存,但那是另一回事) – 2010-11-02 16:24:20