正文

正则表达式法计算字符串算术表达式1(vb2005)2008-07-27 21:07:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/37155.html

分享到:

        今天开始,学习如何用正则表达式来对字符串数学表达式进行处理的方法。主要学习参考资料为《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*\^"

今天先写道这里。

阅读(4790) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册