0

TCP メッセージをサーバーに送信し、それを取得するアプリケーションがあります。

返されるメッセージは次の形式です。

0,"120"1,"データ フィールド 1"2,"2401"3,"データ フィールド 3"1403-1,"複数出現 1"1403-2,"複数出現 2"99,""

したがって、基本的には、連結された一連のフィールドです。
各フィールドには、タグ、コンマ、値がこの順序で含まれています。
タグは数字、値は引用符で囲み、カンマで区切ります。
0,"120"
0 はタグ、120 は値です。

完全なメッセージは常に 0 フィールドで始まり、99"" フィールドで終わります。

複雑なことに、一部のタグには複数の値に分割されているため、ダッシュが付いています。
数字の順序は重要ではありません。

(参考までに、これは「Fedex Tagged Transaction」メッセージです)。

したがって、「完全な」メッセージ (つまり、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('"'));
}

これは実際には機能しません。
引用符とコンマがたくさん残っていて、特に整形式ではないようです...
私は正規表現が苦手なので、必要なことをまとめることができません。

それが最善の方法であるかどうかさえわかりません。

どんな助けでも感謝します。

4

2 に答える 2

1

Regex.Split ではなく Regex.Matches を使用することをお勧めします。このようにして、構造を維持しながら、すべての一致を反復処理し、キャプチャ グループを使用して必要なデータを直接取得することができます。以下の例で、これで機能する正規表現を提供しました。

        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;
        }
于 2013-05-03T14:14:29.363 に答える
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,""
于 2013-05-03T13:45:17.603 に答える