文章转自:
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*/^"
今天先写到这里。