前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA:正则表达式(9) -添加千分位(1/3)

VBA:正则表达式(9) -添加千分位(1/3)

作者头像
Exploring
发布2023-10-08 19:54:49
2180
发布2023-10-08 19:54:49
举报

在之前的一篇文章中介绍了环视,参见文末的参考资料[1]。环视的一个经典应用是添加千分位。添加千分位的一个正则表达式如下:

代码语言:javascript
复制
(?<!\.\d+)(?<=\d+)(?=(\d{3})+(?!\d))
代码语言:javascript
复制
文本:12345678.12345678
替换文本:,
结果:12,345,678.12345678

上面的正则表达式可以拆分成以下三个部分:

(1)?<!\.\d+,逆序否定环视。所在位置的左侧不能出现小数点加数字。这是为了保证小数部分不会添加千分位。

(2)?<=\d+,逆序肯定环视。所在位置的左侧只有数字。这是为了保证在整数部分添加千分位。

(3)?=(\d{3})+(?!\d),顺序肯定环视、顺序否定环视。所在位置的右侧,连续数字字符的个数是三的整数倍;并且其后跟随一个非数字字符(小数点.,或者结束标识符$,等等)。

VBA中通常使用的是VBScript正则(vbscript.regexp),不支持逆序环视。因此,上述的正则表达式在VBA中无法使用,现在通过一种变通的方法来实现这个需求。

1 试错

(1)对于整数,可以使用如下的正则表达式:

代码语言:javascript
复制
(\d)(?=(\d{3})+$)
代码语言:javascript
复制
文本:123456789
替换文本:$1,
结果:123,456,789

从右向左每三位划分为一组,那么末端三位数字的右侧一定就是行的结束标识了;此外,提取三位数字组合左侧的一位数字作为匹配组,用于正则替换。

(2)对于包含小数的字符串,可以使用如下的正则表达式:

代码语言:javascript
复制
(\d)(?=(\d{3})+\.)
代码语言:javascript
复制
文本:1234576.7898
替换文本:$1,
结果:1,234,576.7898

三位数字从小数点开始向左数,所以末端三位数字的右侧就是小数点。

(3)尝试将前面的两个正则表达式合并,得到如下的正则表达式:

代码语言:javascript
复制
(\d)(?=(\d{3})+($|\.))
代码语言:javascript
复制
文本1:123456789
替换文本:$1,
结果:123,456,789
代码语言:javascript
复制
文本2:1234576.7898
替换文本:$1,
结果:1,234,576.7,898

针对包含小数的字符串,合并之后的正则表达式的运行结果并不理想。结束标识$本意是希望用来匹配整数的结尾,但是小数部分也可能匹配到,所以小数部分也添加了千分位,这显然是不对的。

(未完待续)

参考资料:

[1] 正则表达式:断言(环视)

[2] 正则表达式在线测试(https://c.runoob.com/front-end/854/?optionGlobl=global

[3] 正则测试(https://tool.chinaz.com/regex

[4] VBA之正则表达式(9)-- 添加千分位(1/3)(https://blog.csdn.net/taller_2000/article/details/89784517

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-07,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 试错
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com