正则表达式平衡组

zenjj99 2011-02-25 09:03:12
想学习平衡组正则表达式,这种正则式不懂,

这个是我想验证的正则表达式


{if(name == "")}
{elseif(name == "")}
{else}
{/if}


下面的是正则验证字符


{if(name == "1")}
fsc
{elseif(name == "2")}
{if(name == "1")}
ds2
{elseif(name == "3")}
xk00
{else}
25s
{/if}
{else}
df
{/if}


想用平衡组来写,可是

{elseif(name == "")}
{else}

这2个可有可无,相互嵌套时不知道怎么样写,那位前辈能解决呢??
谢谢!!
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenjj99 2011-02-25
  • 打赏
  • 举报
回复
3Q,过客前辈就是厉害,^_^
-过客- 2011-02-25
  • 打赏
  • 举报
回复
在这篇博客的4 平衡组应用范围探讨中我有介绍,这类需求,用正则要加递归来实现
.NET正则基础之——平衡组

//递归方法
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 test = @"{if(name == ""1"")}
fsc
{elseif(name == ""2"")}
{if(name == ""1"")}
ds2
{elseif(name == ""3"")}
xk00
{else}
25s
{/if}
{else}
df
{/if}";
List<string> list = new List<string>();
Regex reg = new Regex(@"(?is){if\(name\s*==(?>{if\(name\s*==(?<o>)|{/if}(?<-o>)|(?:(?!{/?if).)*)*(?(o)(?!)){/if}");
getNesting(test, reg, list);
foreach (string s in list)
{
richTextBox2.Text += s + "\n====================\n";
}
zenjj99 2011-02-25
  • 打赏
  • 举报
回复
能否分成

{if(name == "1")}
fsc
{elseif(name == "2")}
{if(name == "1")}
ds2
{elseif(name == "3")}
xk00
{else}
25s
{/if}
{else}
df
{/if}



{if(name == "1")}
ds2
{elseif(name == "3")}
xk00
{else}
25s
{/if}


能分割只和它结构相关体
-过客- 2011-02-25
  • 打赏
  • 举报
回复
以下面这个为例,你想要的结果是什么?

{if(name == "1")}
fsc
{elseif(name == "2")}
{if(name == "1")}
ds2
{elseif(name == "3")}
xk00
{else}
25s
{/if}
{else}
df
{/if}

zenjj99 2011-02-25
  • 打赏
  • 举报
回复
那我如何能分别{elseif(name == "")}或{else}是属于那个{if(name == "")}和{/if} 的呢?
zenjj99 2011-02-25
  • 打赏
  • 举报
回复
内部那个嵌套不能提取出来
-过客- 2011-02-25
  • 打赏
  • 举报
回复
看你的举例,结束标志{/if}只与{if(name == "")}对应,与{elseif(name == "")}或{else}无关

Regex reg = new Regex(@"(?is){if\(name\s*==(?>{if\(name\s*==(?<o>)|{/if}(?<-o>)|(?:(?!{/?if).)*)*(?(o)(?!)){/if}");
MatchCollection mc = reg.Matches(yourStr);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "\n================\n";
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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