2013-05-03 43 views
0

我有一個應用程序發送一個TCP消息到服務器,並得到一個回。分析RegEx或格式化的字符串

它回來的消息的格式如下:

0, 「120」 1 「數據字段1」 2 「2401」 3 「數據字段3」 1403-1」多個 occurence 1 「1403-2,」 多occurence 2 「99」,」

因此,基本上它是一組串聯在一起的字段。
每個字段都有一個標籤,一個逗號和一個值 - 按此順序。
標記是數字,值在引號內,逗號將它們分開。
0,「120」
0是標記,120是值。

一個完整的消息總是以0字段開頭並以99結尾「」字段。

使事情變得複雜,有些標籤有破折號,因爲它們被分成多個值。
數字的順序不重要。

(僅供參考,這是「Fedex標記交易」消息)。

所以我正在尋找一種體面的方式來驗證我們有一個「完整的」消息(即有0和99個字段) - 因爲它來自TCP消息,我想我必須考慮沒有收到完整的信息呢。
然後分割它以獲得我需要的所有值。

最好的我想出來的是解析是一些可憐的正則表達式和後來的一些清理。 它的心臟是這樣的:(??????\ d \ d \ d \ d - \ d \ d「)分裂它

string s = @"(\d?\d?\d?\d?-?\d?\d,"")"; 
string[] strArray = Regex.Split(receivedData, r); 

Assert.AreEqual(14, strArray.Length, "Array length should be 14", since we have 7 fields.); 

Dictionary<string, string> fields = new Dictionary<string, string>(); 

//Now put it into a dictionary which should be easier to work with than an array 
for (int i = 0; i <= strArray.Length-2; i+=2) 
{ 
    fields.Add(strArray[i].Trim('"').Trim(','), strArray[i + 1].Trim('"')); 
} 

這並不真正發揮作用。
它有很多引號和逗號左過來,似乎並不特別合格...
我不擅長使用正則表達式,所以我不能放在一起我需要它做什麼

我甚至不知道它是否是最好的方式

任何h埃爾普表示讚賞。

回答

1

我建議你使用Regex.Matches而非Regex.Split。通過這種方式,您可以迭代所有匹配項,並使用捕獲組直接獲取所需的數據,同時仍保持結構。我提供了一個正則表達式,可以在下面的例子中使用這個正則表達式:

 MatchCollection matchlist = Regex.Matches(receivedData, @"(?<tag>\d+(?:-\d+)?),""(?<data>.*?)"""); 
     foreach (Match match in matchlist) 
     { 
      string tag = match.Groups["tag"].Value; 
      string data = match.Groups["data"].Value; 
     } 
1

試試這個表達

\d*(-\d*)?,"[^"]*" 

匹配計數:7

0,"120" 
1,"Data Field 1" 
2,"2401" 
3,"Data Field 3" 
1403-1,"multiple occurence 1" 
1403-2,"multiple occurence 2" 
99,""