正则表达式法计算字符串算术表达式

     文章转自:

http://www.programfan.com/blog/article.asp?id=37155

  

 

今天开始,学习如何用正则表达式来对字符串数学表达式进行处理的方法。主要学习参考资料为《vb2005技术内幕》一书。通过学习达到一些目的:一是初识正则表达式及其应用;二是掌握字符串数学表达式的处理方法;三是学习面向对象方法编程的一般方法。

正则表达式

正则表达式此时的作用有两个,一是分析表达式各个元素,分离出数字、函数(如Sin)和运算符等,二是为下一步的计算做好准备。

正则表达式举例

下面列举的正则表达式都是程序中必须用到的,我将逐个解释,请大家尽量搞明白。

1、"/s*[+-]?/d+/.?/d*/b/s*"

上面引号内就是一个正则表达式,它表达什么意义呢。根据正则表达式的语法规定,/s是转义字符,表示空白字符(如空格、制表符、换行符等);/s*中的*号是数量词(零个或多个),整体表示零个或多个空白符;[+-]表示字符串可能包含+或-其中之一,其后的?号也是数量词(零个或单个),[+-]?整体表示字符串中包含不多于一个的+或-;/d+表示字符串必须包含一个以上的数字,其中/d表示数字,+是数量词(一个或多个);/.?表示字符串可以包含至多一个小数点;/d*和上面的/d+区别是,表示字符串在小数点后可以有数字也可以没有,即零个或多个数字;/b表示字符边界。由以上的分析可以知道,上面的表达式其实表示一个浮点数,而且浮点数前后可以有空白字符。如下面的字符串就是匹配该正则表达式的字符串:"    12.222   ","-22"," -120.3333222","+100.90";但是"ss12000",就不符合该正则表达式。正则表达式有专门的语言,大家最好弄张表,随时查阅。

我们在程序中要用到浮点数,所以将其进行如下定义

 Const num As String = "/s*[+-]?/d+/.?/d*/b/s*"

2、"/s*/((?<nump>/s*[+-]?/d+/.?/d*/b/s*)/)/s*"

仔细观察可以发现这个正则表达式其实包含了第一个表达式的内容,那么它当然也可以写为"/s*/((?<nump>" & num "/)/)/s*"。其中(?<nump>" & num )表示如果给定的字符串中包含有符合num正则表达式的字符串的话,就把该num字符串命名为nump;/(和/)分别表示左右括号。由此可见,该正则表达式其实表示一个包含括号的浮点数。如"(-22.333)"、"  ( +33.100)",符合就匹配该规则。

我们在程序中要用到它,所以将其进行如下定义

 Const nump As String = "/s*/((?<nump>" & num & ")/)/s*"

3、"(?<![*/^]/s*)(?<add1>" & num & ")/+(?<add2>& num & ")(?!/s*[*/^])"

这个表达式中的(?<add1>" & num & ")和(?<add2>& num & ")表示将字符串中符合num规则的内容分别命名为add1和add2;(?<![*/^]/s*)表示待处理的字符串中不能包含有*、/和^,因为这是乘、除和幂的运算符;(?!/s*[*/^])也是不能含有*、/和^的意思;/+表示待处理的字符串中要+。由此可见,该正则表达式表示,待处理的字符串是两个浮点数的加法运算表达式。如"  -12.234+33.234 ",但"*22+33.33"就不符合。

我们在程序中要用到它,所以将其进行如下定义

Const add As String = "(?<![*/^]/s*)(?<add1>" & num & ")/+(?<add2>" & num & ")(?!/s*[*/^])"

3、 "(?<![*/^]/s*)(?<sub1>" & num & ")/-(?<sub2>" & num & ")(?!/s*[*/^])"

这个表达式和上面的表达式十分相似,其作用也类似。其实,仔细一看大家就会明白,他们的不同之处在于一个是加法运算一个是减法运算。在程序中我们定义为:

Const subt As String = "(?<![*/^]/s*)(?<sub1>" & num & ")/-(?<sub2>" & num & ")(?!/s*[*/^])"

4、"(?<!/^/s*)(?<mul1>" & num & ")/*(?<mul2> " & nmu & ")(?!/s*/^)"

该表达式中(?<!/^/s*)表示待处理字符串左侧不能含^;(?!/s*/^)表示待处理字符串右侧不能含有^;/*表示*号。由此可见,该规则其实表示两个浮点数的乘法运算。我们在程序中定义为

Const mul As String = "(?!/^/s*)(?<mul1>" & num & ")/*(?<mul2>" & num & ")(?!/s*/^)"

5、"(?!/^/s*)(?<div1>" & num & ")//(?<div2>" & num & ")(?!/s*/^)"

和上一个相似,所不同的是这里是除法运算。定义为:

Const div As String = "(?!/^/s*)(?<div1>" & num & ")//(?<div2>" & num & ")(?!/s*/^)"

6、(?<!/^/s*)(?<mod1>" & num & ")/s+mod/s+(?<mod2>" num & ")(?!/s*/^)"

和上一个相似,这里是求余运算。/s+mod/s+表示待处理字符串中须含有mod,mod前后可以有空白字符。定义为:

Const modu As String = "(?<!/^/s*)(?<mod1>" & num & ")/s+mod/s+(?<mod2>" & num & ")(?!/s*/^"

今天先写到这里。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值