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)