【问题标题】:Parsing a formatted string with RegEx or similar使用 RegEx 或类似方法解析格式化字符串
【发布时间】:2013-05-03 13:39:01
【问题描述】:

我有一个应用程序将 TCP 消息发送到服务器,然后返回。

它返回的消息格式如下:

0,"120"1,"数据字段 1"2,"2401"3,"数据字段 3"1403-1,"多个 出现 1"1403-2,"多次出现 2"99,""

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

完整的消息总是以 0 字段开头,以 99,"" 字段结尾。

为了使事情复杂化,一些标签有破折号,因为它们被分成超过 1 个值。
数字的顺序并不重要。

(供参考,这是一条“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('"'));
}

这实际上不起作用。
它有很多引号和逗号,而且格式似乎不是特别好...
我不擅长正则表达式,所以我无法将我需要它做的事情放在一起。

我什至不知道这是否是最好的方法。

任何帮助表示赞赏。

【问题讨论】:

    标签: c# regex parsing text-parsing


    【解决方案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;
            }
    

    【讨论】:

      【解决方案2】:

      试试这个表达式

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2015-04-10
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2012-01-26
        相关资源
        最近更新 更多