把一个字符串按","分组,要求","前不能有"\"转义.
比如有串@"a=a\bc,b=bc\\,c=cd"
分组后结果应该是一个长度为3的字符串组,
{@"a=a\bc",@"b=bc\\","c=cd"}

解决方案 »

  1.   

    string[] results = @"a=a\bc,b=bc\\,c=cd".split(",".ToCharArray())
      

  2.   

    sorry!上面的写错了,应该是@"a=a\,bc,b=bc\\,c=cd" 
    就是ibm的目录服务中的dn串,里面的","是可以转义的.想把它拆分开.
    谢谢呆呆虫兄弟
      

  3.   

    string content = @"a=a\bc,b=bc\\,c=cd";            string regex = "(?<=(?:\\\\\\\\))|(?<!\\\\),";
                
                System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex);
                string[] result = reg.Split(content);
                for (int i = 0; i < result.Length; i++)
                {
                    //MessageBox.Show(result[i]);看看result[i]是不是楼主想要的?
                }
      

  4.   

    sorry!上面的写错了,应该是@"a=a\,bc,b=bc\\,c=cd"   
    就是ibm的目录服务中的dn串,里面的","是可以转义的.想把它拆分开. 
    -------------------------------------------
    需求变了,把新的结果也贴一下,看看是不是这样的吧string test = @"a=a\,bc,b=bc\\,c=cd";
    string[] result = Regex.Split(test, @"(?<=[^\\]|(\\\\)+),", RegexOptions.ExplicitCapture);
    foreach (string str in result)
    {
        Console.WriteLine(str);
    }
      

  5.   

    我再描述下问题:
    一个逗号分隔的串a,b,c,d... 要把它按","分割成字符串组,即:A[0]=a;A[1]=b;A[2]=c...
    所有的子串如a,b,c或d中可以出现",",但前面要加"\"转义,表示其是单个串中的一部分,而不是用来分隔多个子串的.
    另外,子串(如a)中若有偶数个"\"后面跟","的,因为","前面的所有"\"都被转义为串的一部分,不再有转义效果,所以这个","是用来分隔多个子串的.eg:input=@"a=a\,bc,b=bc\\,c=cd";
    处理之后会被分为3个串,A[0]=@"a=a\,bc",A[1]=@"b=bc\\",A[2]="c=cd"root_ ,我原来的写法和你的一样,得到的结果也一样:)
    用这个模式串得到的结果是个length为4的数组,a=a\,bc;b=bc\\;\\;c=cd 第三个子串@"\\"很奇怪,不知道是怎么来的.还有symbol441,用你的模式串匹配出来的结果中第三个子串居然是",c=cd"实在不解.多谢楼上的朋友们.
      

  6.   

    ...刚才想到了,不过忘记写上去了...
    string content = @"a=a\bc,b=bc\\,c=cd";            string regex = "(?<=(?:\\\\\\\\)),|(?<!\\\\),";            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex);
                string[] result = reg.Split(content);
                for (int i = 0; i < result.Length; i++)
                {
                    MessageBox.Show(result[i]);//看看result[i]是不是楼主想要的?
                }这样就行了
      

  7.   

    感谢symbol441朋友你的模式串对于@"a=a\bc,b=bc\\,c=cd"是可以正确分解的,我奇怪那个"?:"为什么是必须的,当我去掉它的时候捕获的结果会不正确.
    还有这个模式串如果对于普遍的情况需要怎么写?问题的简单描述就是前面跟奇数个"\"的","要看做子串中的一部分,前面跟偶数个"\"的","(包括0个)要看做是分隔符号.希望能写得详细一些.
    抱歉,我真的有点头晕了.
      

  8.   

    root_   ,我原来的写法和你的一样,得到的结果也一样:) 
    用这个模式串得到的结果是个length为4的数组,a=a\,bc;b=bc\\;\\;c=cd   第三个子串@"\\"很奇怪,不知道是怎么来的. 
    ----------------
    楼主用我写的测过吗,你确定结果是个length为4的数组吗?
    在没有加ExplicitCapture参数之前确实是4的,但是加了这个参数之后,就是3了
    string test = @"a=a\,bc,b=bc\\,c=cd";
    string[] result = Regex.Split(test, @"(?<=[^\\]|(\\\\)+),", RegexOptions.ExplicitCapture);
    foreach (string str in result)
    {
        Console.WriteLine(str);
    }
    输出结果为
    a=a\,bc
    b=bc\\
    c=cd
      

  9.   

    又考虑了一下,上面写的,对于楼主给的例子是没问题的,但是对于下面的例子,考虑少了,再改下string test = @"a=a\,bc,b=bc\\\,c=cd";
    string[] result = Regex.Split(test, @"(?<=[^\\](|(\\\\)+)),", RegexOptions.ExplicitCapture);
    foreach (string str in result)
    {
        Console.WriteLine(str);
    }
    上面例子输出结果为
    a=a\,bc
    b=bc\\\,c=cd
      

  10.   

    事实上,上面的写法还有一点没有考虑进去,那就是字符串以“,”开头的情况,不过如果可能出现这种情况,应该先用
    test = test.Trim(',');
    处理一下再分割的,否则第一项的结果是没有意义的空字符串
      

  11.   

    root_朋友
    @"a=a\,bc,b=bc\\,c=cd,d=dso\\\,d,e=a"
    对于这个串,你的模式好像不能正确分割.
    开头如果出现","也会是"\,"或"\\\,"等形式.
      

  12.   

    你给的例子,测试结果是
    a=a\,bc
    b=bc\\
    c=cd
    d=dso\\\,d
    e=aLength=5
    如果不是这个结果,那给出你的结果还有如果开头出现“,”,“\,”,“\\,”分别对应什么样的结果,给出例子
      

  13.   

    root_的答案是正确的.
    在分组时必须加上RegexOptions.ExplicitCapture
    忽略所有非显式命名的分组
      

  14.   

    感谢诸位的帮忙,我昨天试验的时候也是忘了加ExplicitCapture了.root_你的答案是正确的.
    以前我一直以为ExplicitCapture只对捕获结果中的组有影响.
    还是不太明白为什么不捕获非显式分组会对结果有影响
      

  15.   

    捕获组一般可以分为三种,非捕获组,捕获组和命名捕获组在使用正则时,后两种在匹配成功的情况下,都将相应的结果保存到捕获组里,只是在Match和Replace等等应用时,有些捕获组的结果我们可能不会用到,所以也没有去注意它而Split不同,在不加限制的情况下,它会将所有的捕获组内容保存到结果集中,这其中也包括用于分割目的的正则表达式中的捕获组,有的时候,我们要用到“|”来表示“或”的关系,这时候需要加“()”来限定“|”的作用范围,这样就出现了我们并不想保留的捕获组,而ExplicitCapture这个参数的意义也就在于此了