利用正则表达式处理四则运算

本文探讨了如何使用正则表达式处理四则运算,通过先乘除后加减的思路,逐步解决涉及括号和不同运算级别的计算问题。作者首先处理简单的乘除法,然后进行加减运算,并在过程中解决括号的处理,确保正确计算复杂的表达式。文章提供了实现这一方法的源代码供读者参考。
摘要由CSDN通过智能技术生成

  不久之前我写过一篇与或逻辑运算的实现及格式验证的文章,其中验证部分我使用了正则表达式,但计算部分还是依靠基本流程处理的。后来想了想,计算是否也能使用正则表达式呢?再做一个逻辑表达式计算就没太大意思了,这次咱来试试四则运算。

  我的基本思路是先乘除后加减,先运算式子中简单的乘除法例如:“2*5”,但“2*(3+4)”不必处理先,咱们先解决简单的。然后处理简单的加减法,例如"3+4",同样涉及括号的先不处理。最后去括号,但是只去无用的括号,例如“(3)”,这样一来连续的式子(例如:2*8+9/3)总是能化成“(19)”,这样最终被去掉括号变成“19”再与其他部分做运算。只需要重复以上的部分最终就能完成运算了。但其实其中还漏了一步,那就是做完乘除运算之后还有一些应该在加减之前先运算的没有被保护起来,例如:“(1/2+2*3+1)/2+2*3”做完乘除运算之后式子为“(0.5+6+1)/2+6”如果现在执行加减运算,由于“2+6”能够被匹配,所以会被先计算那样就错了。所以先要把“(0.5+6+1)/2”作为一个整体保护起来,我第一想到的办法就是加括号即“((0.5+6+1)/2)+6”,这样就不会被匹配了。但是又有一个问题:如何确定哪些位置需要加括号呢?首先要加括号的地方一定是相乘除的两个部分中刚好有一个是带括号的式子另一个却是普通的数字,不然它一定会在上一步中被消灭掉,或者两个部分都带有括号意味着他们不需要先计算,不需要理会,其次他们没有被括号包围。如果用正则表达式来匹配似乎比较困难,原因是有括号的那一部分中可能有不确定的内层括号,不能简单的用“\(\S+\)”,否则就会出大乱子了。那怎么办呢?想了很久,发现这并不是一种好的解决方法,我开始换一种思路,既然添加括号不方便,那么能不能不加括号却不会造成错误呢?答案是有!例如在“(0.5+6+1)/2+6”中,先计算括号内的简单加减式而不管外面的加减式,也就是在加减运算的正则表达式中首尾加上括号即可。这样的话最终会照成算式无法完成,原因是没有括号的加减法始终不能匹配。要解决这个问题我们还需要加多一个正在表达式来做最后的工作,这个表达式必须能匹配简单加减式,即“((\d+(\.(\d+))?)((\+|\-)(\d+(\.(\d+))?))*)”,且算式匹配的值刚好等于算式本身,否则继续循环下去。这样真的没有问题吗?下面我把源代码贴出来,供大家参考:



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值