有人给了个网络通信协议报文,
格式为:{学校}{班级}{课目}{{姓名1}{姓名2}}{{成绩}{成绩}},
例如{第一中学}{一年级}{数学}{{张三}{李四}}{{89}{92}}。
实际的格式更复杂,大括号是层层嵌套,括号多的的不得了,我想按层读取括号,比如,第一次读取到{第一中学}{一年级}{数学},第二次读取到{{张三}{李四}}。括号的层数不是固定的,只读取求高手给支招,怎么处理这么多的大括号?是用split呢,还是正则或其他。请给详细答案,谢谢!

解决方案 »

  1.   

    这么明显的层可以用XElement解析成xml文件再提取信息
      

  2.   

    把"{"和"}"都replace为" "
    然后再split一下
      

  3.   

    如果用XElement,那么也必须先要解析网络原始的文本啊,我的意思就是怎么能方便快速的把用括号分割的网络报文给解析出来。
      

  4.   

    大体看了一下平衡组,好似能解决。
    实例:
    string soketMsg = "{第一中学}{一年级}{数学}{{张三}{李四}}{{89}{92}}";其实我就想把字符串拆解,就像脱衣服似的,层层扒掉,得到其中的信息段:
    扒开第一层得到:
    string[] data = {"第一中学","一年级","数学","{张三}{李四}","{89}{92}"};
    如果用到其中的子信息,再扒开一层,得到:
    string[] name = {"张三","李四"};
    string[] score = {"89","92"};你若会平衡组,请直接给出代码吧,谢谢!
      

  5.   

    用平衡组吧,我研究了下这样差不多。没测试过啊。\{[^\{\}]* ( ( (?'Open'\{)[^\{\}]* )+ ( (?'-Open'\})[^\{\}]* )+ )* (?(Open)(?!)) \}
      

  6.   

    测试代码:
        string tstr = "{第一中学}{一年级}{数学}{{张三}{李四}}{{89}{92}}";
                Regex reg = new Regex(@"\{[^\{\}]* ( ( (?'Open'\{)[^\{\}]* )+ ( (?'-Open'\})[^\{\}]* )+ )* (?(Open)(?!)) \}");
                string text = "";
                MatchCollection mc = reg.Matches(tstr);
                foreach (Match m in mc)
                {
                    text += m.Value + " ";
                }
    测试结果:text = "";不给力阿
      

  7.   

    照猫画虎终于欧了!
      Regex reg = new Regex(@"\{((?<Open>\{)|(?<-Open>\})|[^{}])*(?(Open)(?!))\}");
      

  8.   


                string tstr = "{第一中学}{一年级}{数学}{{张三}{李四}}{{89}{92}}";
                //Regex reg = new Regex(@"\{[^\{\}]* ( ( (?'Open'\{)[^\{\}]* )+ ( (?'-Open'\})[^\{\}]* )+ )* (?(Open)(?!)) \}");
                //Regex reg = new Regex(@"\{[^{}]*\}");
                Regex reg = new Regex(@"\{[^{}]*(((?'Open'{)[^{}]*)+((?'-Open'})[^{}]*)+)*(?(Open)(?!))\}");
                string text = "";
                MatchCollection mc = reg.Matches(tstr);
                foreach (Match m in mc)
                {
                    Console.WriteLine(m.Value);
                }
                Console.ReadLine();测了没问题了,是一些转义字符和空格的问题