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

    技术2024-10-18  58

         文章转自:

    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)