博客
关于我
VBA之正则表达式(9)-- 添加千分位(1/3)
阅读量:278 次
发布时间:2019-03-03

本文共 914 字,大约阅读时间需要 3 分钟。

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

正则表达式 说明
(?<=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组三位数字的右侧就是小数点。

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

这篇博文先讲到这里,下一篇继续分享这个话题。


相关博文链接:

转载地址:http://cdjl.baihongyu.com/

你可能感兴趣的文章
从xx离职随笔
查看>>
大数据学习之Spark——00Spark项目的pom.xml文件
查看>>
大数据学习之Spark——01Spark概述
查看>>
大数据学习之Spark——03Spark代码初体验(Word Count)
查看>>
LeetCode0234. 回文链表
查看>>
比特币史话·78 | 有容乃大(2): 零食售卖机
查看>>
比特币史话·96 | 隐私(3): 熔币重铸
查看>>
Filecoin主网上线,它是谁、割了谁?
查看>>
一切不能跑赢比特币的勤奋,都是愚蠢的努力
查看>>
Fire prejudice: 巴菲特搭档芒格首度认可比特币
查看>>
从 MFC 移植程序到 wxWidgets 界面库 ——《定时执行专家 5.0》的界面实现
查看>>
GLUT和wxWidgets在OpenGL开发中的比较
查看>>
CodeBlocks开发wxWidgets环境配置详细
查看>>
Qt 转向 LGPL之后,wxWidgets 路在何方
查看>>
[翻译]2009年6月wxWidgets更新 - 支持图标的wxButton
查看>>
wxAUI - wxWidgets用户界面框架 - 使用感受
查看>>
wxSqlite3 - wxWidgets封装的Sqlite数据库访问类库 - 使用感受
查看>>
wxSqlite3 和 wxPropertyGrid 类库的说明
查看>>
wxSqlite3类库的使用感受 - 关于乱码的问题
查看>>
天涯人脉通讯录 - 设计草图
查看>>