问一条正则表达式

LiangWu25 2009-11-19 03:48:26
如何把“1+2-3*4"这样的内容,用正则式拆成:
1+2
2-3
3*4
这样?
请正则高手指点!这里不需要考虑运算符优先级
...全文
211 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsd123 2009-11-19
  • 打赏
  • 举报
回复
.
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
不好意思,给的分太少,请各位不要在意分,尤其是jiangshun^_^,到后面没分了。谢谢各位了!在各位的推荐下看了过客的博客,全是正则表达式的知识,有时间我好好学习一下!
-过客- 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 mbh0210 的回复:]
过客的博客正则的篇幅很多,而且写的确实不错。等过客写的差不多了打包一下以后当字典用,哈哈
[/Quote]

呵呵,我也有意整理一个理论结合实例的资源包,就是现在时间太少,没法整理这个,而且经典案例收集的还不够,只能慢慢来了
mbh0210 的正则已经运用得很到位了,而且.NET版现在还有wuyi8808、LCL_data、jiangshun、wackyboy,我想我真的可以去搞些其它研究了
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
再次谢谢各位了!真是不想结贴,想看看还有哪些精彩的回复!不过还是结了算了,努力向各位学习正则表达式!
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 jiangshun 的回复:]
C# codestring test="1+sum(3)-4*2+dfasdf+616+函数(字段)";
Regex reg=new Regex(@"(?<=(?<info>(?<=[\+\-\*\/]).*?(?=[\+\-\*\/])[\+\-\*\/](?<=[\+\-\*\/]).*?(?=[\+\-\*\/])))");//Regex reg = new Rege?-
[/Quote]

刚要结贴又看到jiangshun 的回复!佩服!哈哈,搞得我都不想结贴了!这个结果也是对的!
jiangshun 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 liangwu25 的回复:]
引用 18 楼 jiangshun 的回复:
在孤独求败基础上改的

C# codestring test="1+sum(3)-4*2";//Regex reg = new Regex(@"(? <=[-+\*/])\d+(?=[-+\*/])"); Regex reg=new Regex(@"(? <=(? <info>(((sum|avg|count)\(\d+\))|\d+)[\+\-\*\/]((sum\(\d+\))|\d+)))");
MatchCollection mc= reg.Matches(test);foreach (Match min mc)
{
Console.WriteLine(m.Groups["info"].ToString());
}


刚看到jiangshun的回复,谢谢!不过一个是函数名可能是未指定,第二函数中也不一定是数字。

多谢各位的答复了^_^!
[/Quote]

你可以试试,不管是什么都可以的,指定未指定,数字字母,符号,中文都可以,只要是+-*/中间的都可以,
你可以试试就知道了
June1991 2009-11-19
  • 打赏
  • 举报
回复
学习
June1991 2009-11-19
  • 打赏
  • 举报
回复
学习
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jiangshun 的回复:]
在孤独求败基础上改的

C# codestring test="1+sum(3)-4*2";//Regex reg = new Regex(@"(?<=[-+\*/])\d+(?=[-+\*/])"); Regex reg=new Regex(@"(?<=(?<info>(((sum|avg|count)\(\d+\))|\d+)[\+\-\*\/]((sum\(\d+\))|\d+)))");
MatchCollection mc= reg.Matches(test);foreach (Match min mc)
{
Console.WriteLine(m.Groups["info"].ToString());
}
[/Quote]

刚看到jiangshun的回复,谢谢!不过一个是函数名可能是未指定,第二函数中也不一定是数字。

多谢各位的答复了^_^!
liherun 2009-11-19
  • 打赏
  • 举报
回复
呵呵,搞搞简单的还凑合,遇到麻烦的总是说
限定符 {x,y} 前没有任何内容。
jiangshun 2009-11-19
  • 打赏
  • 举报
回复
string test = "1+sum(3)-4*2+dfasdf+616+函数(字段)";
Regex reg = new Regex(@"(?<=(?<info>(?<=[\+\-\*\/]).*?(?=[\+\-\*\/])[\+\-\*\/](?<=[\+\-\*\/]).*?(?=[\+\-\*\/])))");
//Regex reg = new Regex(@"(?<=(?<info>(((sum|avg|count)\(\d+\))|\d+)[\+\-\*\/]((sum\(\d+\))|\d+)))");
MatchCollection mc = reg.Matches("-"+test+"-"); //注意在这里做了点小小操作
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["info"].ToString());
}


/*
------输出结果------------
1+sum(3)
sum(3)-4
4*2
2+dfasdf
dfasdf+616
616+函数(字段)


*/
mbh0210 2009-11-19
  • 打赏
  • 举报
回复
过客的博客正则的篇幅很多,而且写的确实不错。等过客写的差不多了打包一下以后当字典用,哈哈
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 lxcnn 的回复:]
引用 15 楼 liangwu25 的回复:
我的用意是为了验证表达式: X+X-X*X (X代表未知,可能是字符,可能是数字,可能是函数)是否是正确的表达式。因为 +,-,*,/只能用于数字,所以我需要把它们拆成:
X+X
X-X
X*X
,再分别判断 +,-,*,/ 两边是否为数字(不一定看上去是数字,而是结果是否为数字,比如X为Sum()函数)


如果是想验证规则的话,完全没必要拆分再验证,直接验证就是了

只要给出完整的规律描述就可以了,比如有哪些函数,是否会有嵌套
[/Quote]

直接验证并不好验证,因为表达式并不是直接的数字加法。而是类似于:
1+字段名*3+函数(字段名)-5
这种表达式。字段名和函数在文本框中呈现都是字符串,我的做法是先验证函数,再验证字段名表示的字段是为是数字字段,最后验证这种“+,-,*,/“两头是不是都是数字结果?

再次多谢mbh0210!
liherun 2009-11-19
  • 打赏
  • 举报
回复
独孤求败和过客都是正则高手,我现在混过客的博客呢
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
mbh0210太厉害了!话还没说完就搞定了!这个正则表达式困扰我很久,谢谢!
-过客- 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liangwu25 的回复:]
我的用意是为了验证表达式: X+X-X*X (X代表未知,可能是字符,可能是数字,可能是函数)是否是正确的表达式。因为 +,-,*,/只能用于数字,所以我需要把它们拆成:
X+X
X-X
X*X
,再分别判断 +,-,*,/ 两边是否为数字(不一定看上去是数字,而是结果是否为数字,比如X为Sum()函数)
[/Quote]

如果是想验证规则的话,完全没必要拆分再验证,直接验证就是了

只要给出完整的规律描述就可以了,比如有哪些函数,是否会有嵌套
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lcl_data 的回复:]
引用 13 楼 liangwu25 的回复:
谢谢这么多高手过来捧场^_^! lxcnn、mbh0210的结果是正确的,不过我这里只是例举的最简单的表达式,假如是 1 + sum(3) - 4*2,能拆成:
1+sum(3)
sum(3)-4
4*2吗?

如果你运算不带括号的话 应该修改下就可以了
[/Quote]

好,谢谢,我再试试,不过表达式中函数肯定会有括号的,而且括号中会有内容。
mbh0210 2009-11-19
  • 打赏
  • 举报
回复
上面我写的那个有点问题。试试:

string str = "1 + sum(3) - 4*2";
List<string> reglist = new List<string>();
Regex re = new Regex(@"(?<=(?<num>[^+-/\*]+[+-/\*])(?=(?<info>[^+-/\*]+)))");
foreach (Match m in re.Matches(str))
{
reglist.Add(m.Groups["num"].Value + m.Groups["info"].Value);
}
jiangshun 2009-11-19
  • 打赏
  • 举报
回复
在孤独求败基础上改的

            string test = "1+sum(3)-4*2";
//Regex reg = new Regex(@"(?<=[-+\*/])\d+(?=[-+\*/])");
Regex reg = new Regex(@"(?<=(?<info>(((sum|avg|count)\(\d+\))|\d+)[\+\-\*\/]((sum\(\d+\))|\d+)))");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
Console.WriteLine(m.Groups["info"].ToString());
}
LiangWu25 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jiangshun 的回复:]
引用 13 楼 liangwu25 的回复:
谢谢这么多高手过来捧场^_^! lxcnn、mbh0210的结果是正确的,不过我这里只是例举的最简单的表达式,假如是 1 + sum(3) - 4*2,能拆成:
1+sum(3)
sum(3)-4
4*2吗?


还有其他的情况吗?能一次说完吗?比如avg?count?等等
[/Quote]


呵呵,不好意思!其实我并不是不想一次说完,本以为只要解决题中的例子就可以了,但是刚才试了下加入函数,结果没有出来。
加载更多回复(16)

110,538

社区成员

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

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

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