日期:2014-05-16  浏览次数:20499 次

问一个正则问题,嵌套匹配的
本帖最后由 ysn1314 于 2014-05-02 09:08:30 编辑
做一个cms自定义标签,当标签嵌套时比较麻烦,
我希望标签是一对一对出现 现在问题是嵌套标签时 第一个标签会匹配嵌套标签的结束字符
正则能不能实现这样的匹配


{html}
1
{html}
2
{/html}
3
{/html}

{html}4{/html}


像上面这个 1位置前面html按正常写会匹配到3前面的{/html},而不是后面的
我想问 能不能获取

1
{html}
2
{/html}
3

跟 4 ,

1 2 3 4的位置是任意字符

类似 if else 嵌套的判断 里面的归里面 外面是外面
if{ if{}else{} }else{}      if{}else{}
里面if跟里面else是一对 外面if跟外面else是一对 不会混掉 不知道这么说各位能不能明白我的意思?
------解决方案--------------------

            string validatorPattern = @"^[^\{}]*((\{(?'tag'\w+)}[^\{}]*)+((?'close-tag'\{/\k<tag>})[^\{}]*)+)*[\{}]*(?(tag)(?!))$";
            string locationPattern = @"(\{(?'tag'\w+)}[^\{}]*)((\{(?'tag'\w+)}[^\{}]*)+((?'close-tag'\{/\k<tag>})[^\{}]*)+)*(?'close-tag'\{/\k<tag>})(?(tag)(?!))";

            string input = @"{html}1{html}2{/html}3{/html}{html}4{/html}";

            Match validator = Regex.Match(input, validatorPattern, RegexOptions.Singleline);
            if (validator.Success == true)
            {
                var locator = new Regex(locationPattern, RegexOptions.Singleline);
                foreach (Match m in locator.Matches(input))
                {
                    Console.WriteLine("Block at {0}", m.Index);
                    Console.WriteLine(m.Value);
                }
            }
            else
            {
                Console.WriteLine("Match failed.");
            }


不如楼主是否需要的这个效果?


MSDN正则表达式
http://msdn.microsoft.com/zh-cn/library/az24scfc(v=vs.100).aspx

分组构造之平衡组定义
http://msdn.microsoft.com/zh-cn/library/bs2twtah(v=vs.100).aspx

反向引用构造之命名的后向引用
http://msdn.microsoft.com/zh-cn/library/thwdfzxy(v=vs.100).aspx




------解决方案--------------------

//提供思路  不需要正则 就可以实现简单的标签截取, 如果要是标签复杂, 把检索字符串方法换成正则的就可以了
            List<string> list = new List<s