请问一个正则表达式

LiangWu25 2009-07-30 04:47:50
假如有如下字符串:
1+Sum(1,Sum(2))*4+5

怎样写正则表达式才能得到如下结果:
=======================================
sum(1,sum(2))
sum(2)
=======================================
谢谢了!
...全文
341 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_风中雪狼 2009-07-31
  • 打赏
  • 举报
回复
过客强呀
LiangWu25 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lxcnn 的回复:]
就是取“Sum”嵌套结构吗?
其实这种问题并不适合用正则来解决的,不是解决不了,主要是效率的问题
这种问题用正则解决,嵌套结构要用到平衡组,效率本身就不高,通常又要用递归来取内部结构,效率又打一折扣
其实这种需求可以自己写有穷自动机来解决,很久以前写过类似的,有空再想想吧,先给个正则的实现凑合用着吧

C# code//递归方法privatevoid getNesting(string src, Regex reg, List<string> list)
{
MatchCollection mc= reg.Matches(src);foreach(Match min mc)
{
list.Add(m.Value);
src= m.Value.Remove(m.Value.Length-1,1);if (reg.IsMatch(src))
{
getNesting(src, reg, list);
}
}
}//调用string test="1+Sum(1,Sum(2, Sum(3), 4), 5)*4+5+Sum(9,Sum(8, Sum(7), 6), 5)*6+7";
List<string> list=new List<string>();
Regex reg=new Regex(@"(?is)Sum\((?>(?<o>)\(|(?<-o>)\)|[^()])*(?(o)(?!))\)", RegexOptions.Compiled);
getNesting(test, reg, list);foreach (string sin list)
{
richTextBox2.Text+= s+"\n";
}//输出Sum(1,Sum(2, Sum(3),4),5)
Sum(2, Sum(3),4)
Sum(3)
Sum(9,Sum(8, Sum(7),6),5)
Sum(8, Sum(7),6)
Sum(7)
[/Quote]

由衷的说一句:你太强了!
其他人请抱歉我想把所有分都给他~~~
超维电脑科技 2009-07-31
  • 打赏
  • 举报
回复
关注
virus7581 2009-07-30
  • 打赏
  • 举报
回复
up
-过客- 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lcl_data 的回复:]
引用 2 楼 wangjun8868 的回复:
C# codestring str="1+Sum(1,Sum(2))*4+5";
        Regex reg=new Regex(@"(? <href>sum\(([^\,]+)?\d+\))", RegexOptions.IgnoreCase);
        MatchCollection mc= reg.Matches(str);foreach (Match min mc)
        {
            Response.Write(m.Groups["href"].Value);
        }
        Response.End();
强客客的分

传说人家客客上班时间很少来csdn
[/Quote]

弱弱的说,上班时间根本就上不了网,白天只能中午抽半个小时左右上来扫两眼
-过客- 2009-07-30
  • 打赏
  • 举报
回复
就是取“Sum”嵌套结构吗?
其实这种问题并不适合用正则来解决的,不是解决不了,主要是效率的问题
这种问题用正则解决,嵌套结构要用到平衡组,效率本身就不高,通常又要用递归来取内部结构,效率又打一折扣
其实这种需求可以自己写有穷自动机来解决,很久以前写过类似的,有空再想想吧,先给个正则的实现凑合用着吧

//递归方法
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 = "1+Sum(1,Sum(2, Sum(3), 4), 5)*4+5+Sum(9,Sum(8, Sum(7), 6), 5)*6+7";
List<string> list = new List<string>();
Regex reg = new Regex(@"(?is)Sum\((?>(?<o>)\(|(?<-o>)\)|[^()])*(?(o)(?!))\)", RegexOptions.Compiled);
getNesting(test, reg, list);
foreach (string s in list)
{
richTextBox2.Text += s + "\n";
}
//输出
Sum(1,Sum(2, Sum(3), 4), 5)
Sum(2, Sum(3), 4)
Sum(3)
Sum(9,Sum(8, Sum(7), 6), 5)
Sum(8, Sum(7), 6)
Sum(7)
编程有钱人了 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liangwu25 的回复:]
我还是希望能问下正则表达式,有解答吗?
[/Quote]

难了 呼叫客客
LiangWu25 2009-07-30
  • 打赏
  • 举报
回复
我还是希望能问下正则表达式,有解答吗?
十八道胡同 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wangjun8868 的回复:]
C# codestring str="1+Sum(1,Sum(2))*4+5";
Regex reg=new Regex(@"(?<href>sum\(([^\,]+)?\d+\))", RegexOptions.IgnoreCase);
MatchCollection mc= reg.Matches(str);foreach (Match min mc)
{
Response.Write(m.Groups["href"].Value);
}
Response.End();
强客客的分
[/Quote]
传说人家客客上班时间很少来csdn
mbh0210 2009-07-30
  • 打赏
  • 举报
回复
楼主应该是为了解析公式,然后计算,看看逆波兰式吧
LiangWu25 2009-07-30
  • 打赏
  • 举报
回复
再厚脸一并问了:
1+Sum(1,Sum(2))*4+5
=====================================
第一个正则表达式得到:
sum(1,sum(2))
sum(2)

再求一个正则表达式得到:
1,sum(2)
2
<也就是sum里的参数〉

能得到吗?
LiangWu25 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wangjun8868 的回复:]
引用 3 楼 liangwu25 的回复:
(?  <href>sum\(([^\,]+)?\d+\))
=====================================
怎么会有? <href>  ??


用2L我给你代码测试下  我本地能行的
[/Quote]

我就得到一个Sum(2),我还希望能得到sum(1,sum(2))
编程有钱人了 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liangwu25 的回复:]
(? <href>sum\(([^\,]+)?\d+\))
=====================================
怎么会有? <href>  ??
[/Quote]

用2L我给你代码测试下 我本地能行的
LiangWu25 2009-07-30
  • 打赏
  • 举报
回复
没看到你第二个回复,我试试!
LiangWu25 2009-07-30
  • 打赏
  • 举报
回复
(? <href>sum\(([^\,]+)?\d+\))
=====================================
怎么会有?<href> ??
编程有钱人了 2009-07-30
  • 打赏
  • 举报
回复

string str = "1+Sum(1,Sum(2))*4+5 ";
Regex reg = new Regex(@"(?<href>sum\(([^\,]+)?\d+\))", RegexOptions.IgnoreCase);
MatchCollection mc = reg.Matches(str);
foreach (Match m in mc)
{
Response.Write(m.Groups["href"].Value);
}
Response.End();

强客客的分
编程有钱人了 2009-07-30
  • 打赏
  • 举报
回复
(?<href>sum\(([^\,]+)?\d+\))

110,539

社区成员

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

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

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