2011-05-25 37 views
1

我所分析的數據當前存儲到一個StringBuilder,我想將它解析爲我的班級名單:將字符串/字符串生成器解析到類中,我該如何去解決它?

StringBuilder data = new StringBuilder(length); 

所以,我有我的類分配給一個列表:

public class Messages 
{ 
    public DateTime Sent { get; set; } 
    public string User {get; set; } 
    public MessageType TypeUsed { get; set; } 
    public string Message { get; set; } 
} 

public enum MessageType 
{ 
    System, 
    Info, 
    Warn 
} 

public List<Messages> myList = new List<Messages>(); 

現在,這裏有一些消息的樣品,我需要解析:

[13:49:13] [System Message] <Username> has openned blocked website 
[13:49:14] <Username> accessed file X 
[13:52:46] [System Message] <Username> has entered this room 
[13:52:49] [System Message] <Username> has left this room 

我在這裏的疑問是什麼會是分析它的最佳方式。

時間出現在所有消息中。 Usernaem始終與<> 當沒有[System Message][Warn Message]它是一個信息類型消息。 消息是休息例子:

has left this room 
accessed file X 
has openned blocked website 

現在這裏是我還在想用什麼。

我可以使用正則表達式來提取每個字符串是這樣的:

Regex getData = new Regex(@"^\[(\d{1,2}:\d{1,2}:\d{1,2})\] \[([A-Za-z]+)\] "); 

但後來我就basicly需要爲每個消息幾項檢查,所以我不這麼舒適。

因子評分關於採用分體式例如:

string line = item.Replace("[", "").Replace("]", ""); 
string[] fields = line.Split(' '); 

,然後我會檢查分裂的情況下很容易檢測的消息類型,但不那麼可靠,我認爲。

我想提出一些建議和想法,告訴我如何配合這一點?

也許我只是過於複雜的邏輯:/

回答

2

一個正則表達式可能是最方便的位置。嘗試這一個:

^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(System|Warn)[\w\s]*\])?\s*<([^>]*)>\s*(.*)$ 

翻譯:

  • 開始在該行的開頭,匹配[##:##:##]到捕獲組1
  • 然後任選地匹配系統/警告符成捕獲組2和3(2保持在括號中的所有文本,3只有系統/警告關鍵字)
  • 然後捕獲角括號內的用戶名到捕獲組4
  • 最後在消息文本中第5組

通過測試每行的組2或3的內容,您知道它是什麼類型的消息。所有其他字段都可以直接使用捕獲組。

更新:

這裏的示例代碼按上面:

var regex = new Regex(@"^\[(\d{2}:\d{2}:\d{2})\]\s*(\[(System|Warn)[\w\s]*\])?\s*<([^>]*)>\s*(.*)$"); 
var input = new[] 
    { 
     "[13:49:13] [System Message] <Username> has openned blocked website", 
     "[13:49:14] <Username> accessed file X", 
     "[13:52:46] [System Message] <Username> has entered this room", 
     "[13:52:49] [System Message] <Username> has left this room" 
    }; 

foreach (var line in input) { 
    var match = regex.Match(line); 
    if (!match.Success) { 
     throw new ArgumentException(); 
    } 

    Console.WriteLine("NEW MESSAGE:"); 
    Console.WriteLine("  Time: " + match.Groups[1]); 
    Console.WriteLine("  Type: " + match.Groups[2]); 
    Console.WriteLine("  User: " + match.Groups[4]); 
    Console.WriteLine("  Text: " + match.Groups[5]); 

} 
+0

+1以及詳細的,這聽起來很酷我最初考慮使用正則表達式,但然後,我就在案件stucked當它沒有[System *]信息時,我會檢查你的示例謝謝。 – Prix 2011-05-25 17:58:22

+0

@Prix:爲了方便,我添加了一些示例代碼,請查看它。 – Jon 2011-05-25 18:00:29

+0

非常感謝這個例子;) – Prix 2011-05-25 18:13:26