社区
C#
帖子详情
算术表达式的正则表达式
止戈而立
2005-12-27 04:02:36
一个算术表达式可能含有以下元素:
数字,运算符(+-*/),正号负号,小括号。
求其正则表达式。。
...全文
1353
14
打赏
收藏
算术表达式的正则表达式
一个算术表达式可能含有以下元素: 数字,运算符(+-*/),正号负号,小括号。 求其正则表达式。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
peak_weng
2006-01-04
打赏
举报
回复
mark
止戈而立
2005-12-28
打赏
举报
回复
TO: netmicro(麦) 。。
不错,我要的正是这样的结果。。
关键是我没想到这一步:(?<o>\()(?#左括号,保存到o名字下)
因此自己没能写出来。。
好。。散分了。。
netmicro
2005-12-28
打赏
举报
回复
需要修正一下……结尾之前加了个判断
Regex regex = new Regex(@"
^ (?#匹配开头)
[-+]? (?#开头可以出现正负号)
([0-9]+($|[-+*/]))* (?#可选数-符号-数-符号-……-数-符号或结尾)
(
(
(?<o>\() (?#左括号,保存到o名字下)
[-+]? (?#可选正负号)
([0-9]+[-+*/])* (?#可选数-符-数-符……)
)+ (?#可以重复出现左括号)
[0-9]+ (?#左右括号之间最起码需要一个操作数)
(
(?<-o>\)) (?#右括号,匹配的同时去掉一个左括号)
([-+*/][0-9]+)* (?#可选符-数-符-数……)
)+ (?#可以重复出现右括号,仅当还有左括号剩余)
($|[-+*/]) (?#要么结尾,要么在下一个左括号出现之前出现一个运算符)
)* (?#重复出现左括号)
(?(o)(?!)) (?#如果还有左括号剩余就不匹配任何东西)
(?<=[0-9)]) (?#检查结尾前是否数字或右括号)
$ (?#匹配结尾)
", RegexOptions.IgnorePatternWhitespace);
string[] tests = new string[] {
"1",
"1+23",
"1+23*456",
"1*(23+456)",
"(3)",
"((67+8)*9+10)/11",
"12+(13*)",
"()",
"((3)",
"(3))",
"+3",
"5*(4+3/(-2))",
"(5*(4+3/(-2))",
"5*(4+3/(-2)))",
"+3*",
"+(4)+(-5)",
"+(4)(5)",
};
foreach (string s in tests)
Console.WriteLine("{0}: {1}", regex.IsMatch(s) ? "Good" : " Bad", s);
Console.ReadKey();
netmicro
2005-12-28
打赏
举报
回复
Regex regex = new Regex(@"
^ (?#匹配开头)
[-+]? (?#开头可以出现正负号)
([0-9]+($|[-+*/]))* (?#可选数-符号-数-符号-……-数-符号或结尾)
(
(
(?<o>\() (?#左括号,保存到o名字下)
[-+]? (?#可选正负号)
([0-9]+[-+*/])* (?#可选数-符-数-符……)
)+ (?#可以重复出现左括号)
[0-9]+ (?#左右括号之间最起码需要一个操作数)
( (?#)
(?<-o>\)) (?#右括号,匹配的同时去掉一个左括号)
([-+*/][0-9]+)* (?#可选符-数-符-数……)
)+ (?#可以重复出现右括号,仅当还有左括号剩余)
($|[-+*/]) (?#要么结尾,要么在下一个左括号出现之前出现一个运算符)
)* (?#重复出现左括号)
(?(o)(?!)) (?#如果还有左括号剩余就不匹配任何东西)
$ (?#匹配结尾)
", RegexOptions.IgnorePatternWhitespace);
string[] tests = new string[] {
"1",
"1+23",
"1+23*456",
"1*(23+456)",
"(3)",
"((67+8)*9+10)/11",
"12+(13*)",
"(()",
"((3)",
"(3))",
"+3",
"5*(4+3/(-2))",
"(5*(4+3/(-2))",
"5*(4+3/(-2)))",
};
foreach (string s in tests)
Console.WriteLine("{0}: {1}", regex.IsMatch(s) ? "Good" : " Bad", s);
Console.ReadKey();
//结果:
//Good: 1
//Good: 1+23
//Good: 1+23*456
//Good: 1*(23+456)
//Good: (3)
//Good: ((67+8)*9+10)/11
// Bad: 12+(13*)
// Bad: (()
// Bad: ((3)
// Bad: (3))
//Good: +3
//Good: 5*(4+3/(-2))
// Bad: (5*(4+3/(-2))
// Bad: 5*(4+3/(-2)))
我猜只有.NET的RegEx提供“平衡组定义匹配”(Balanced group definition)
参考:http://blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx
Ivony
2005-12-28
打赏
举报
回复
可以用正则来判断符号问题,
括号匹配可以计算前后括弧的数量是否相等……
止戈而立
2005-12-28
打赏
举报
回复
栈或者树倒是一个方法。。
有人以为我是要计算表达式。。实际上我这个题目只是验证表达式的合法性而已。。
xiaohuluwa
2005-12-28
打赏
举报
回复
这个表达式的情况太多,用正则不大合适。
建议用数据结构中的栈或者树的方法
LGame
2005-12-28
打赏
举报
回复
必须要用正则表达式吗??
不行就绕过去吧!
止戈而立
2005-12-28
打赏
举报
回复
关键在于括号的匹配问题。。。看大伙有没有好的建议。。
aSalt
2005-12-28
打赏
举报
回复
这属于分析表达式;
建议看看基础的书
aSalt
2005-12-28
打赏
举报
回复
难于实现
linuxyf
2005-12-27
打赏
举报
回复
这个不是正则的强项,难于实现
Tiangua
2005-12-27
打赏
举报
回复
好像在数据结构的树上一般有这个算法吧。
止戈而立
2005-12-27
打赏
举报
回复
比较难写,,大半天没见一人影。。
正则
表达式
法计算字符串
算术
表达式
文章转自:http://www.programfan.com/blog/article.asp?id=37155
今天开始,学习如何用
正则
表达式
来对字符串数学
表达式
进行处理的方法。主要学习参考资料为《vb2005技术内幕》一书。通过学习达到一些目的:一是初识
正则
表达式
及其应用;二是掌握字符串数学
表达式
的处理方法;三是学习面向对象方法编程的一般方法。
正则
表达式
正则
表达式
此时的作用有两个,一是分析
表达式
各个元素,分
正则
表达式
法计算字符串
算术
表达式
2
接着昨天的内容继续学习。
8、"(?
" & num & ")/^ (?
" & num & ")
该
表达式
比较简单,是幂的运算。如字符串"123.123^3.32"就匹配该规则。程序中定义为
Const pow As String = "(?
" & num & ")/^(?
" & num & ")"
9、"(?
(exp|log|log10|abs|sqr|sqrt|sin|cos|ta
正则
表达式
的七种类型
使用
正则
表达式
处理文本,其实还可以有
算术
表达式
,像
正则
表达式
一样。他们的共同点是,先编译再执行。总的来说,有七种类型: ①直接出结果 ②f() ③f(str) ④f(regex) ⑤f(str,regex) ⑥动态的,运行时编译 ⑦使用全局变量g,f() 其中,①③⑤是常用的,④⑦是不常用的。 对于①,直接出结果,它是"1+2*3"之类的算数
表达式
,在程序的编译阶段直接替换为7。 对于②f(),它可以编译成无参数的函数,例如"rand ()"。 对于③f(str),这是有变量做参数的情况,多数
正则
表达式
是这
C#处理
算术
表达式
中的负数
最近写的一个C# 程序中要用到简单的
算术
式计算,当时想到了《数据结构》里学的什么中缀
表达式
、后缀表达等知识,但项目紧张真不想从头实现。 于是搜索一下(关键词: C#
算术
表达式
),找到一篇有关《C#
算术
表达式
的计算》的文章。于是将作者的代码测试了一下,发现不支持单目运算符(比如:负数) 的情况。 仔细了解一下,发现其算法主要参考了一篇C语言的《
算术
表达式
的计算》的文章。追溯
JAVA利用正则获取
算术
表达式
的数字
前言利用
正则
表达式
匹配
算术
表达式
中的数字,正负均可提取。 临时抱佛脚写的,如果有更好的办法,你会告诉我的对吧?
算术
表达式
String expression = "-40+(-6-4)+-2-91";
正则
表达式
//断言数字左边为符号,符号-会出现0次或1次,再出现数字至少一次的数字 //或者 //以符号-开头,后面是数字 String reg = "((?<=\\(|-|\\+|/|\\*)-?\\
C#
111,129
社区成员
642,535
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章