C# 使用正则表达式或类似表达式分析格式化字符串

C# 使用正则表达式或类似表达式分析格式化字符串,c#,regex,parsing,text-parsing,C#,Regex,Parsing,Text Parsing,我有一个应用程序,它向服务器发送一条TCP消息,然后返回一条 它返回的消息格式如下: 0、“120”1、“数据字段1”2、“2401”3、“数据字段3”1403-1、“多个” 发生1“1403-2”,多次发生2“99” 因此,它基本上是一组连接在一起的字段。 每个字段都有一个标记、一个逗号和一个值,按顺序排列。 标记是数字,值是引号,逗号分隔它们。 0,“120” 0是标记,120是值。 完整的消息始终以0字段开头,以99“”字段结尾 使事情复杂化的是,有些标记带有破折号,因为它们被拆分为多个值

我有一个应用程序,它向服务器发送一条TCP消息,然后返回一条

它返回的消息格式如下:

0、“120”1、“数据字段1”2、“2401”3、“数据字段3”1403-1、“多个” 发生1“1403-2”,多次发生2“99”

因此,它基本上是一组连接在一起的字段。
每个字段都有一个标记、一个逗号和一个值,按顺序排列。
标记是数字,值是引号,逗号分隔它们。
0,“120”
0是标记,120是值。

完整的消息始终以0字段开头,以99“”字段结尾

使事情复杂化的是,有些标记带有破折号,因为它们被拆分为多个值
数字的顺序不重要。

(供参考,这是一条“联邦快递标记交易”信息)

因此,我正在寻找一种合适的方法来验证我们是否有一条“完整”消息(即有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('"'));
}
string s=@“(\d?\d?\d?-?\d?\d,”);
string[]strArray=Regex.Split(receivedData,r);
arenequal(14,strArray.Length,“数组长度应该是14”,因为我们有7个字段);
字典字段=新字典();
//现在将它放入一个字典中,它应该比数组更容易使用
对于(inti=0;i请尝试此表达式

\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,""

我建议您使用Regex.Matches而不是Regex.Split。通过这种方式,您可以迭代所有匹配项,并使用捕获组直接捕获所需的数据,同时仍保持结构。我在下面的示例中提供了一个Regex,它可以用于此目的:

        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;
        }
MatchCollection matchlist=Regex.Matches(receivedData,@“(?\d+(?:-\d+)”,“(?*?)”;
foreach(匹配列表中的匹配)
{
string tag=match.Groups[“tag”].Value;
字符串数据=匹配。组[“数据”]。值;
}