正则表达式平衡组问题

zenjj99 2011-02-26 09:37:33
基本结构,
{if}
{elseif}
{else}
{/if}

{elseif}和{else}可有可无,{elseif}允许多个

查询字符:
{if}
fsc
{if}
ds2
{elseif}
xk00
{if}
xx
{elseif}
fd
{else}
54
{/if}
{/if}
{else}
df
{/if}
我想获取每层基本结构{if}、{elseif}、{else}和{/if}的索引位置。
谢谢!
...全文
209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zenjj99 2011-02-26
  • 打赏
  • 举报
回复
不是做项目的,就是想到,不知道怎么实现,所以来问过客前辈们
wanghui0380 2011-02-26
  • 打赏
  • 举报
回复
如果你是做项目
google “词法分析,BNF范式,EBNF范式,irony,antir”

如果你就是想学习 正则处理,那就当我啥也没说
zenjj99 2011-02-26
  • 打赏
  • 举报
回复
基本结构含{if}、{elseif}、{else}、{/if}
我想的就是能判断出这种基本结构的位置(不能含有嵌套在基本结构中的基本结构)
zenjj99 2011-02-26
  • 打赏
  • 举报
回复
{if}
fsc
{elseif}
93
{elseif}
{if}
ds2
{elseif}
xk00
{if}
xx
{elseif}
fd
{else}
54
{/if}
{/if}
{else}
df
{/if}
我的表达能力不太好,
就是查找红色部分的位置
-过客- 2011-02-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 zenjj99 的回复:]
我想获取每层基本结构{if}、{elseif}、{else}和{/if}的索引位置。
[/Quote]

看不大懂需求,什么叫索引位置,这样?

string test = @"{if}
fsc
{if}
ds2
{elseif}
xk00
{if}
xx
{elseif}
fd
{else}
54
{/if}
{/if}
{else}
df
{/if}";
Regex reg = new Regex(@"(?i){(/?(else)?if|else)}");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += "索引:" + m.Index + " 匹配内容:" + m.Value + "\n";
}
/*-------输出-------
索引:0 匹配内容:{if}
索引:13 匹配内容:{if}
索引:28 匹配内容:{elseif}
索引:46 匹配内容:{if}
索引:56 匹配内容:{elseif}
索引:70 匹配内容:{else}
索引:82 匹配内容:{/if}
索引:91 匹配内容:{/if}
索引:98 匹配内容:{else}
索引:110 匹配内容:{/if}
*/


如果不是的话,给出你想要的结果吧
-过客- 2011-02-26
  • 打赏
  • 举报
回复
实现倒是能实现,不过问题最好从实际出发,否则对你的指导意义不大

string test = @"{if}
fsc
{elseif}
93
{elseif}
{if}
ds2
{elseif}
xk00
{if}
xx
{elseif}
fd
{else}
54
{/if}
{/if}
{else}
df
{/if}";

Regex reg = new Regex(@"(?i){(/?(else)?if|else)}");
while (Regex.Matches(test = Regex.Replace(test, @"(?is){if\b(?:(?!{/?if).)*{/if}", ""), @"(?is){if\b").Count > 1) { }
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += "索引:" + m.Index.ToString().PadRight(3) + " 匹配内容:" + m.Value + "\n";
}
/*---------输出--------
索引:0 匹配内容:{if}
索引:11 匹配内容:{elseif}
索引:25 匹配内容:{elseif}
索引:39 匹配内容:{else}
索引:51 匹配内容:{/if}
*/
zenjj99 2011-02-26
  • 打赏
  • 举报
回复
虽然还是以{if}和{/if}来分隔,但要是中间嵌套了基本结构,提取{elseif}和{else}时就混乱了吧?
huangwenquan123 2011-02-26
  • 打赏
  • 举报
回复
            
//喔 你还要它的位置

string str = "wwww{if}aaaa{if}bbbb{if}cccc{/if}dddd{/if}eeee{/if}wwww";
Regex reg = new Regex(@"((?<Open>{if})[^{]*)*((?<-Open>{/if})[^{]*?)*(?(Open){?!})");
Match match = reg.Match(str);
if (match.Success)
{
Response.Write(match.Value+"<br/>");
Regex reg_index = new Regex("({if}|{/if})");
MatchCollection match_index = reg_index.Matches(str);
foreach (Match m in match_index)
{
CaptureCollection cc = m.Groups[1].Captures;
foreach (Capture c in cc)
{
Response.Write(c.Index+"<br/>");
}
}
}
/*输出
{if}aaaa{if}bbbb{if}cccc{/if}dddd{/if}eeee{/if}
4
12
20
28
37
46
*/
huangwenquan123 2011-02-26
  • 打赏
  • 举报
回复
            string str = "wwww{if}aaaa{if}bbbb{if}cccc{/if}dddd{/if}eeee{/if}wwww";
Regex reg = new Regex(@"((?<Open>{if})[^{]*)*((?<-Open>{/if})[^{]*?)*(?(Open){?!})");
MatchCollection match = reg.Matches(str);
foreach (Match m in match)
{
Response.Write(m.Value);
}
zenjj99 2011-02-26
  • 打赏
  • 举报
回复
最后一行是我问的问题
兔子-顾问 2011-02-26
  • 打赏
  • 举报
回复
(?is){if}((?<o>{if})|(?<-o>{/if})|((?!{/?if}).)+)+(?(o)(?!)){/if}
zenjj99 2011-02-26
  • 打赏
  • 举报
回复

查询字符:
{if}
fsc
{if}
ds2
{elseif}
xk00
{if}
xx
{elseif}
fd
{else}
54
{/if}
{/if}
{else}
df
{/if}

容易看点

110,534

社区成员

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

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

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