求一正则表达式,匹配花括号的嵌套

beckfun 2011-04-29 08:00:30
求一正则表达式,数据格式如{0123{0165}},要求先匹配到{01230165}——即{0165}然后再匹配最外层的0123{0165}花括号

实在没折了..只能找正则帮忙了..
...全文
1725 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckfun 2011-05-01
  • 打赏
  • 举报
回复
问题是解决了...解决的方法很基础很老套....就是递归匹配最内层数据...匹配到后替换后再递归匹配...要使用的时候在的递归解串...虽然是解决了..但是程序的可读性非常差...

谢谢LS的给出的正则...等五一结束回公司了再去测试...
beckfun 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dongxinxi 的回复:]

要包含花括号?
[/Quote]嗯..要包含{} 我题目中的花括号可能是在打字过程中没有转成E文..呵呵程序中是{}这样的花括号..还有花括号里的内容不一定是数字...也有可能是其他字符 ..
huangwenquan123 2011-04-30
  • 打赏
  • 举报
回复

//用平衡组来实现
string str = "{0123{0165}},{4567{890-}}";
Regex reg = new Regex(@"{[^{}]*(((?<Open>{)[^{}]*)+((?<-Open>})[^{}]*)+)*(?(Open)(?!))}");
foreach (Match m in reg.Matches(str))
{
Response.Write(m.Groups[1].Value + "===" + m.Value + "<br/>");
}
/*
{0165}==={0123{0165}}
{890-}==={4567{890-}}
*/
sxldfang 2011-04-30
  • 打赏
  • 举报
回复
当然,你把所有的空白删除,然后连成一行,也是没有问题的
sxldfang 2011-04-30
  • 打赏
  • 举报
回复
用下面的正则,可以尽可能多的匹配,为看的清晰,采用下面的松散结构,但可直接使用:


@"(?x)
{
[^{}]*
(
( (?'k'{) [^{}]* )+
( (?'-k'}) [^{}]* )+
)*
(?(k)(?!))
}"
sxldfang 2011-04-30
  • 打赏
  • 举报
回复
问题解决了吗?现在需要什么?最多的嵌套?
beckfun 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sxldfang 的回复:]

引用 7 楼 beckfun 的回复:
一般来讲会是配对的...如果不配对...就是在{}一对花括号值里不能出现"{",或者"}" 其实也就是最里层


仅取最内层的括号!
C# code

static void Main(string[] args)
{
string html = @"...";
MatchCollection mc = Regex.Matche……
[/Quote]你的这个方法我自己已经写出来了...用了递归来匹配.嵌套..不是很方便...
sxldfang 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beckfun 的回复:]
一般来讲会是配对的...如果不配对...就是在{}一对花括号值里不能出现"{",或者"}" 其实也就是最里层
[/Quote]

仅取最内层的括号!

static void Main(string[] args)
{
string html = @"...";
MatchCollection mc = Regex.Matches(html, @"{[^{}]+}");
{
foreach (Match m in mc)
{
Console.WriteLine(m.Value);
}
}
Console.ReadKey();
}
beckfun 2011-04-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dongxinxi 的回复:]

C# code

string inputString = "{0在123{05w中35}}{04的有有56{0在wr不是辊 78}}";
MatchCollection mc = new Regex(@"{[^{}]+({[^}]+})}").Matches(inputString);
foreach (Match m in mc)
Console.WriteLine(m.Group……
[/Quote]一般来讲会是配对的...如果不配对...就是在{}一对花括号值里不能出现"{",或者"}" 其实也就是最里层
嵌套的话..当然能越多越好..
  • 打赏
  • 举报
回复

string inputString = "{0在123{05w中35}}{04的有有56{0在wr不是辊 78}}";
MatchCollection mc = new Regex(@"{[^{}]+({[^}]+})}").Matches(inputString);
foreach (Match m in mc)
Console.WriteLine(m.Groups[1].Value + "\t" + m.Groups[0].Value);


如果确定括号只嵌套两层就可以满足你的需求
等高手来写一个严密的,具体要你看你{}的配队情况,如果括号不成对或者嵌套多层,你想要的结果又是什么?最里层和最外层?还是次外层和最外层?
  • 打赏
  • 举报
回复
要包含花括号?
  • 打赏
  • 举报
回复
LZ你的{不是半角的
  • 打赏
  • 举报
回复

string inputString = "{0123{0165}}{0456{0678}}";
MatchCollection mc = new Regex(@"(?<={)(\d+){(\d+)}(?=})").Matches(inputString);
foreach (Match m in mc)
Response.Write(m.Groups[2].Value + " " + m.Groups[1].Value + "<br />");

/*
0165 0123
0678 0456
*/

m.Groups[2].Value为里层括号里的,m.Groups[1].Value 为外层
beckfun 2011-04-29
  • 打赏
  • 举报
回复
难道半夜发帖没人看?!!!

62,268

社区成员

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

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

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

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