任意一字符串,将其用其中的分号分隔为多个子字串,但处于{}或()或''或“”或<>中的分号不参与分隔。各类括号有可能嵌套!

解决方案 »

  1.   

    -_-#,果然是没有解决。我用有限状态机写了一个方法,自己测试认为可以了,但是在贴出来之前,我必须明确一下,楼主上一帖子里所给的例子showMSG("<div class='Desc'><u onclick=\"test('张三','111');\" style='cursor:hand'>[张三]</u>加入<u onclick=\"list('my'+this.innerHTML);\" style='cursor:hand'>同学会</u></div>");分割后的结果是什么,因为我无法理解楼主所给这个例子另外,楼主最好再给几个例子,同时给出结果,我好做测试请注意,我要的例子和结果,缺一不可
      

  2.   

    我这个列子有点问题,这个列子中只有最后一个参加分隔,结果就是前面
    showMSG("<div class='Desc'><u onclick=\"test('张三','111');\" style='cursor:hand'>[张三]</u>加入<u onclick=\"list('my'+this.innerHTML);\" style='cursor:hand'>同学会</u></div>")
    是一个字符串,后面是一个空字串。
    但这是一个最正常的例子。在举一列,try{xx("张三");}catch(tt){};return true;
    这句就分为三部分,
    一为try{xx("张三");}catch(tt){}
    二为return true
    三为一空字串
      

  3.   

    哈,这样才对嘛,你那个例子让我郁闷了好了阵^o^如下方法假定你的字符串中,{}、()等等都是配对出现的,没有加入不配对的检查,如有这个需要,说明一下,楼主再测一下,如果有不符合的,给出例子private List<string> GetSplit(string src)
    {
        int sbracket = 0;   //尖括弧
        int rbracket = 0;   //圆括弧 
        int lbracket = 0;   //大括弧
        int sqs = 0;    //单引号
        int dqs = 0;    //双引号    StringBuilder sb = new StringBuilder();    List<string> list = new List<string>();    foreach (char c in src)
        {
            if (sbracket == 0 && rbracket == 0 && lbracket == 0 && sqs == 0 && dqs == 0)
            {
                if (c == '<')
                    sbracket++;
                else if (c == '(')
                    rbracket++;
                else if (c == '{')
                    lbracket++;
                else if (c == '\'')
                    sqs++;
                else if (c == '"')
                    dqs++;
                else if (c == ';')
                {
                    if (sb.Length > 0)
                        list.Add(sb.ToString());
                    sb = new StringBuilder();
                    continue;
                }            sb.Append(c);
            }
            else if (sbracket != 0 || rbracket != 0 || lbracket != 0 || sqs != 0 || dqs != 0)
            {
                if (c == '<')
                    sbracket++;
                else if (c == '(')
                    rbracket++;
                else if (c == '{')
                    lbracket++;
                else if (c == '\'' && sqs % 2 == 0)
                    sqs++;
                else if (c == '"' && dqs % 2 == 0)
                    dqs++;            if (c == '>')
                    sbracket--;
                else if (c == ')')
                    rbracket--;
                else if (c == '}')
                    lbracket--;
                else if (c == '\'' && sqs % 2 != 0)
                    sqs--;
                else if (c == '"' && dqs % 2 != 0)
                    dqs--;            sb.Append(c);
            }
        }    if (sb.Length > 0)
            list.Add(sb.ToString());    return list;
    }
    调用:
    string test = "try{xx(\"张三\");}catch(tt){};return true;";
    List<string> result = GetSplit(test);
    foreach (string s in result)
    {
        richTextBox2.Text += s + "\n";
    }输出:
    try{xx("张三");}catch(tt){}
    return true
    PS:最后的空串没要,应该是没有要的必要吧