问一个正则问题,嵌套匹配的

闲游四疯 2014-05-02 09:03:19
做一个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是一对 不会混掉 不知道这么说各位能不能明白我的意思?
...全文
224 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
闲游四疯 2014-05-04
  • 打赏
  • 举报
回复
嗯 2楼是我想要的 不过我看不懂 另开贴求解了 3楼不是正则 不好套 因为还有其它逻辑判断
冰川711 2014-05-03
  • 打赏
  • 举报
回复

//提供思路  不需要正则 就可以实现简单的标签截取, 如果要是标签复杂, 把检索字符串方法换成正则的就可以了
            List<string> list = new List<string>();
            string str = "{html}1{html}2{/html}3{/html}{html}4{/html}";
            string startLabel = "{html}";
            string endLabel = "{/html}";

            int start = str.IndexOf(startLabel) + startLabel.Length;
            int end = str.IndexOf(endLabel, start);
            int tempstart = str.IndexOf(startLabel, start, end - start);
            while (start > 5)
            {
                while (tempstart > -1)
                {
                    end = str.IndexOf(endLabel, end + endLabel.Length);
                    tempstart = str.IndexOf(startLabel, tempstart + startLabel.Length, end - (tempstart + startLabel.Length));
                }
                list.Add(str.Substring(start, end - start));
                start = str.IndexOf(startLabel, end + endLabel.Length, str.Length - (end + endLabel.Length))+startLabel.Length;
                end = str.IndexOf(endLabel, start);
            }
            //结果   list[0]="1{html}2{/html}3"  list[1]="4"
佛火 2014-05-03
  • 打赏
  • 举报
回复

            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

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧