求平衡组,正则表达式

symbol_bc 2012-01-04 03:10:13
为了捕获这样结构的字符串 {demo:loop id=1 /} 或者 {demo:loop id=2}sdfwsdf {/demo:loop}
这样的字符串,我的正则
//Regex r = new Regex(@"(\{demo:(?<name>[^\]]*?)\s+(?<attributes>[^\]]*?)\}(?<text>[\s\S]*?)\{/demo:(?<name>[^\]]*?)\})", RegexOptions.Compiled | RegexOptions.IgnoreCase);

可以看到,loop是我要捕获的分组,attributes是我要捕获的属性,text是我要捕获的内容,但是涉及到嵌套就会有问题,
请高手帮我用平衡组写一下,谢谢。
...全文
133 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
symbol_bc 2012-01-04
  • 打赏
  • 举报
回复
哥们,你太牛逼了,我把分给你,你有qq吗,我想还有更多问题请教你。我私信发给你我的qq号。
  • 打赏
  • 举报
回复
string pattern = @"(?i)\{demo:(?<name>[^\s{}]*)\s+(?<attributes>[^\s=]*)[^{}]*/}|\{demo:(?<name>[^\s{}/]*)\s+(?<attributes>[^\s=]*)[^{}]*?}(?<text>[^{}]*({demo[^}]*}(?<Open>)|{/demo[^}]*}(?<-Open>)|(?:(?!{/?demo\b)[\s\S])*)*)({/demo[^}]*})?";
symbol_bc 2012-01-04
  • 打赏
  • 举报
回复
凡是{demo:common id=3 /}这样的 string text = m.Groups["text"].Value;
都应该是空,还有
string tempStr = @"
{demo:common id=0 /}
{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}";

这个字符串只匹配了一次,没有全部匹配到。谢谢
  • 打赏
  • 举报
回复
1可以捕获

string tempStr = @"{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}";
string pattern = @"(?i)\{demo:(?<name>[^\s{}]*)\s+(?<attributes>[^\s=]*)[^{}]*?}(?<text>[^{}]*({demo[^}]*}(?<Open>)|{/demo[^}]*}(?<-Open>)|(?:(?!{/?demo\b)[\s\S])*)*)({/demo[^}]*})?";
foreach (Match m in Regex.Matches(tempStr, pattern))
{
//循环输出
string value = m.Value;
/* 匹配内容
{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}

*/
string name = m.Groups["name"].Value;//loop
string text = m.Groups["text"].Value;//
/* 匹配内容

sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}


*/



}
symbol_bc 2012-01-04
  • 打赏
  • 举报
回复
十分感谢,还有两个问题
1. {demo:loop id=1 /} 这种情况好像捕获不到
2. {demo:loop id=2}
sdfwsdf
{demo:loop id=3}sdfwsdf {/demo:loop}
{/demo:loop}
如果这种嵌套的情况,我希望{demo:loop id=2},它的m.Groups["text"].Value是

{demo:loop id=3}sdfwsdf {/demo:loop}

就是m.Groups["text"].Value应该是包含内部的一切字符,这可以实现吗
  • 打赏
  • 举报
回复
前面捕获了name,后面无需再次捕获

string tempStr = @"{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}";
string pattern = @"(?i)\{demo:(?<name>[^\s{}]*)\s+(?<attributes>[^\s=]*)[^{}]*?}(?<text>[^{}]*)({demo[^}]*}(?<Open>)|{/demo[^}]*}(?<-Open>)|(?:(?!{/?demo\b)[\s\S])*)*{/demo[^}]*}";
foreach (Match m in Regex.Matches(tempStr, pattern))
{
//循环输出
string text = m.Value;
string name = m.Groups["name"].Value;//loop

/* 匹配内容
{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}

*/
}
symbol_bc 2012-01-04
  • 打赏
  • 举报
回复
谢谢回复,还有点问题
string ss = m.Groups["name"].Value; 是空的,什么也没有
  • 打赏
  • 举报
回复
 string tempStr = @"{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}";
string pattern = @"(?i)\{demo:(?<name>[^\s{}]*)\s+(?<attributes>[^\s=]*)[^{}]*?}(?<text>[^{}]*)({demo[^}]*}(?<Open>)|{/demo[^}]*}(?<-Open>)|(?:(?!{/?demo\b)[\s\S])*)*{/demo:(?<name>[^\{}]*?)[^}]*}";
foreach (Match m in Regex.Matches(tempStr, pattern))
{
//循环输出
string text = m.Value;


/* 匹配内容
{demo:loop id=1}
sdfwsdf
{demo:loop id=2}测试一{/demo:loop}
{demo:loop id=3}测试二{/demo:loop}
{/demo:loop}

*/
}
愚知 2012-01-04
  • 打赏
  • 举报
回复
帮顶、学习吧!实在不会!

62,243

社区成员

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

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

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

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