假如有如下字符串:
 1+Sum(1,Sum(2))*4+5怎样写正则表达式才能得到如下结果:
=======================================
sum(1,sum(2))
sum(2)
=======================================
谢谢了!

解决方案 »

  1.   


      string str = "1+Sum(1,Sum(2))*4+5 ";
            Regex reg = new Regex(@"(?<href>sum\(([^\,]+)?\d+\))", RegexOptions.IgnoreCase);
            MatchCollection mc = reg.Matches(str);
            foreach (Match m in mc)
            {
                Response.Write(m.Groups["href"].Value);
            }
            Response.End();强客客的分
      

  2.   

    (? <href>sum\(([^\,]+)?\d+\))
    =====================================
    怎么会有?<href>  ??
      

  3.   


    我就得到一个Sum(2),我还希望能得到sum(1,sum(2)) 
      

  4.   

    再厚脸一并问了:
    1+Sum(1,Sum(2))*4+5
    =====================================
    第一个正则表达式得到:
    sum(1,sum(2)) 
    sum(2) 再求一个正则表达式得到:
    1,sum(2)
    2
    <也就是sum里的参数〉能得到吗?
      

  5.   

    传说人家客客上班时间很少来csdn
      

  6.   

    就是取“Sum”嵌套结构吗?
    其实这种问题并不适合用正则来解决的,不是解决不了,主要是效率的问题
    这种问题用正则解决,嵌套结构要用到平衡组,效率本身就不高,通常又要用递归来取内部结构,效率又打一折扣
    其实这种需求可以自己写有穷自动机来解决,很久以前写过类似的,有空再想想吧,先给个正则的实现凑合用着吧//递归方法
    private void getNesting(string src, Regex reg, List<string> list)
    {
        MatchCollection mc = reg.Matches(src);
        foreach(Match m in mc)
        {
            list.Add(m.Value);
            src = m.Value.Remove(m.Value.Length-1, 1);
            if (reg.IsMatch(src))
            {
                getNesting(src, reg, list);
            }
        }
    }
    //调用
    string test = "1+Sum(1,Sum(2, Sum(3), 4), 5)*4+5+Sum(9,Sum(8, Sum(7), 6), 5)*6+7";
    List<string> list = new List<string>();
    Regex reg = new Regex(@"(?is)Sum\((?>(?<o>)\(|(?<-o>)\)|[^()])*(?(o)(?!))\)", RegexOptions.Compiled);
    getNesting(test, reg, list);
    foreach (string s in list)
    {
        richTextBox2.Text += s + "\n";
    }
    //输出
    Sum(1,Sum(2, Sum(3), 4), 5)
    Sum(2, Sum(3), 4)
    Sum(3)
    Sum(9,Sum(8, Sum(7), 6), 5)
    Sum(8, Sum(7), 6)
    Sum(7)