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