HTML代码如下<div>{ id="a" /}</div>
<div>{ id="{ id="c" /}" /}</div>
我需要依次匹配{ id="a" /}、{ id="c" /}、{ id="{ id="c" /}" /},当有嵌套的情况时,需从里到外匹配,匹配成功时可将内容替换成别的字符。不知道表达得清不清楚,望各位不吝赐教~

解决方案 »

  1.   

    {((?<o>{)|(?<-o>})|.)*?(?(o)(?!))}
      

  2.   

    递归方法
    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 tempStr = File.ReadAllText(@"C:\Documents and Settings\Administrator\桌面\Test.txt", Encoding.GetEncoding("GB2312"));//读取txt
                    string pattern = @"\{((?<Open>\{)|(?<-Open>\})|[\s\S])*?(?(Open)(?!))\}";
                    Regex reg = new Regex(pattern);
                    List<string> list = new List<string>();
                    getNesting(tempStr, reg, list);
                    /*
                     *  [0] "{ id=\"a\" /}" string
                    [1] "{ id=\"{ id=\"c\" /}\" /}" string
                    [2] "{ id=\"{ id=\"c\" /}" string                 */
      

  3.   

    谢谢两位的解答,表达式好像还是有点问题,我测试字符串“<div>{ id='a' /}</div><div>{ id='{ id='c' }' /}</div>” 得到的三个结果是
    1:{ id='a' /} 
    2:{ id='{ id='c' }' /} 
    3:{ id='{ id='c' }
    第3个不对,应该是{ id='c'};
      

  4.   


    string pattern = @"(?i)\{(?>[^{}]+|\{(?<o>)|\}(?<-o>))*(?(o)(?!))\}";