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

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

作者头像
Exploring
发布2023-10-10 10:28:19
2650
发布2023-10-10 10:28:19
举报
文章被收录于专栏:数据处理与编程实践

上一篇文章(参见文末的参考资料[1])提到,包含小数的字符串出现在文本末尾时,正则表达式的运行效果还是不太理想。由于小数部分符合匹配规则,因此,小数部分也添加了千分位。

前文使用的正则表达式如下:

代码语言:javascript
复制
((\.\d+[\w\W]*?)*?\d)(?=(\d{3})+(\D|$))

解决的一个思路是:既然目前的正则表达式可以过滤掉小数部分的数字,那我们可以在字符串末尾构成一个符合匹配规则的字符串(例如:8888),这样就可以把最后一个匹配组扩展到添加的后缀字符串中;正则替换完成后,去掉后缀字符串。注意,替换完成后,需要去掉的字符串长度增加一位,因为多了一个千分位。

代码语言:javascript
复制
原始文本:123456789.1234555
文本末尾添加四个8:123456789.12345558888
替换文本:$1,
结果:123,456,789.12345558,888
去掉8,888,得到:123,456,789.1234555

使用的VBA代码如下:

代码语言:javascript
复制
Option Explicit
Option Base 1

Sub RegExpDemo3()

    '添加千分位

    Dim objRegEx As Object, strRes As String
    
    Dim strTxt As String, strPad As String
    
    Set objRegEx = CreateObject("vbscript.regexp")
    objRegEx.Pattern = "((\.\d+[\w\W]+?)*?\d)(?=(\d{3})+(\D|$))"
    objRegEx.Global = True
    'objRegEx.MultiLine = True
    
    strPad = "8888"
    
    strTxt = "光速是300000000米/秒" & vbNewLine & _
             "随机数33333.1415926535"
             
    strRes = objRegEx.Replace(strTxt & strPad, "$1,")
    
    MsgBox strTxt & vbNewLine & vbNewLine & _
           Left(strRes, Len(strRes) - Len(strPad) - 1)
           
    Set objRegEx = Nothing
    
End Sub

运行结果:

参考资料:

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

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

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

[4] vba正则中,multiline的作用(https://blog.csdn.net/ljr_123/article/details/115327125)

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

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

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

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