假设有
 String s = "{AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDDDDDDDDD},{AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDHHDDDDD},{AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDFFDDDD}";现在想把这个字符串分割成3份,分别是string s1 = "{AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDDDDDDDDD}";
string s2 = "{AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDHHDDDDD}";
string s2 = "{AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDFFDDDD}";
规则就是每个最外围的{}内必须都有个一个'KEY':\d+的字符串用{.*?'KEY':\d+.*?}来匹配得出的结果是string s1 = "{AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX}";
string s2 = "{AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX}";
string s2 = "{AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX}";不是我想要的结果.分析下,关键就是字符串中也有}这个符号,但是这个}前面必然有个{和他匹配,现在就是怎么排除里面的这对{}

解决方案 »

  1.   

    private static void TestRegex22()
    {
        String s = "{AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDDDDDDDDD},{AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDHHDDDDD},{AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDFFDDDD}";
        MatchCollection mc = Regex.Matches(s, @"\{[^}]*'KEY'[^}]*\}");
        foreach (Match m in mc)
        {
            Console.WriteLine(m.Value);
        }
    }
      

  2.   

    没仔细看你要求,嵌套。忽略上面的,这样写。
    private static void TestRegex22()
    {
        String s = "{AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDDDDDDDDD},{AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDHHDDDDD},{AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDFFDDDD}";
        MatchCollection mc = Regex.Matches(s, @"{((?<o>\{)|(?<-o>\})|[^{}])+(?(o)(?!))}");
        List<string> lines = new List<string>();
        foreach (Match m in mc)
        {
            lines.Add(m.Value);
            Console.WriteLine(m.Value);
        }
        //lines就是你需要的结果
    }
      

  3.   

    输出结果:
    {AAAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':1111,FFFFFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDDDDDDDDD}
    {AAAAAAAAAAAAAAAAAAAAAAA,'KEY':22222,FFFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDHHDDDDD}
    {AAAAAAAAAAAAAAAAAAAAAAAAAA,'KEY':3,FFFFFFFFFFFFFF{CCCCCC:XXXXX},DDDDDDDDFFDDDD}如果还有问题,跟帖,贴出范例。这个帖子提问的相当好。描述清晰,例子很好。
      

  4.   

    网上找了点资料,优化后的@"{(?>[^{}]+|{(?<o>)|}(?<-o>))*(?(o)(?!))}"
    参考了http://blog.csdn.net/lxcnn/archive/2009/08/03/4402808.aspx