VBA之正则表达式(9)

在正则表达式中有如下几种环视(断言),很多正则的教学文章中都会讲解其含义,也有一些例子。

正则表达式 说明
(?<=Expression) 逆序肯定环视,表示所在位置左侧能够匹配Expression
(?<!Expression) 逆序否定环视,表示所在位置左侧不能匹配Expression
(?=Expression) 顺序肯定环视,表示所在位置右侧能够匹配Expression
(?!Expression) 顺序否定环视,表示所在位置右侧不能匹配Expression

环视的一个经典应用就是添加千分位:(?<!\.\d+)(?<=\d+)(?=(\d{3})+(?!\d)),正则表达式看起来似乎有些乱,四种环视都用到了,而且还有嵌套。

正则表达式 说明
(?<!.\d+) 表示所在位置左侧没有小数点加数字
(?<=\d+) 表示所在位置左侧只有数字
(?!\d) 表示所在位置右侧不是数字
?=(\d{3})+(?!\d) 表示所在位置右侧连续数字字符个数是三的整数倍,并其后跟随一个非数字字符(小数点,结束标识等)

效果如图所示,整数和小数都可以正常添加千分位。

正则表达式有了,VBA中不就是手到擒来的事情吗,其实不然,VBA中通常使用的是VBScript正则,不支持逆序环视,这也是大家经常听到的说法 – 添加千分位在VBA正则中无法实现,用Format函数实现吧。这个说法未必正确,不支持逆序环视是肯定的,但是可以有变通的方法来实现这个需求。


先简化一下应用场景,如果只考虑整数,回想一下千分位的规则,从右向左每三位划分为一组,那么N组三位数字的右侧一定就是行的结束标识了,由于VBA不支持逆序环视,所以就不能基于定位之前的字符组合了,但是可以提取三位数字组合左侧的一位数字作为匹配组,用于正则替换。

对于包含小数的字符串,三位组从小数点开始向左数,所以N组三位数字的右侧就是小数点。

现在合并两个正则表达式如下图,其结果和想象的不同,末尾$本来是希望用来匹配整数的结尾,但是第一行的小数部分也符合这个模式,所以小数部分也添加了千分位,这显然是不对。

(0)

相关推荐