上一篇《添加千分位(1/3)》博文讲到,简单合并正则表达式无法实现想要的效果,问题在于小数部分数字。
这里的核心是如何消耗掉小数部分的数字,不被捕获,可以实现添加千分位功能的正则表达式如下:
((\.\d+[\w\W]*?)*?\d)(?=(\d{3})+(\D|$))
测试段落为
大家背诵圆周率3.1415926535
珠穆朗玛峰高度8848.0
光速是300000000米/秒
马里亚纳海沟最大长度: 2550,平均深度: 8000,
最大宽度: 69,最大深度11034
捕获组 | 正则表达式 |
---|---|
$1 | ((\.\d+[\w\W]*?)*?\d) |
$2 | (\.\d+[\w\W]*?) |
$3 | (\d{3}) |
$4 | (\D|$) |
捕获组3和4组合而成的断言(?=(\d{3})+(\D|$)
和上一篇博文中的用法一致,其中\D
代表非数字字符。
表达式中[\w\W]
看着有些奇怪,\w
代表字母和数字,\W
代表非字母和非数字,加在一起不就是全部吗,但是需要注意这个组合比常用的\.
多一个新行标识。
分析一下捕获组2。
正则表达式 | 含义 |
---|---|
\.\d+ | 小数点加至少一位数字开头 |
[\w\W]*? | 懒惰匹配任意数量任意字符 |
分析一下捕获组1。
正则表达式 | 含义 |
---|---|
($2)*? | 匹配任意数量匹配组2,即可以有或者没有小数点 |
\d | 匹配一位数字 |
接下来看一下实际匹配的结果。第一个成功匹配的结果为黄色部分,也就是
$1 = .1415926535[换行]珠穆朗玛峰高度8
其后为848.
,可以匹配断言(?=(\d{3})+(\D|$)
。
第二个成功匹配的结果为蓝色部分,也就是
$1 = .0[换行]光速是300
其后为000
,也可以匹配断言(?=(\d{3})+(\D|$)
。
依次类推,这样就定位到了需要添加千分位的字符的位置,即每一个匹配组1之后的位置,使用正则替换就可以简单的实现添加千分位的目的。这个正则的核心是如何消耗掉小数点及其之后的数字。
![](https://i-blog.csdnimg.cn/blog_migrate/02eafba6a6a6e01ada26cceb67c68ffc.png)
正则表达式有了,附上VBA代码。
Sub RegExpDemo2()
Dim strTxt As String
Dim objRegEx As Object
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Pattern = "((\.\d+[\w\W]+?)*?\d)(?=(\d{3})+(\D|$))"
objRegEx.Global = True
'objRegEx.MultiLine = True
strTxt = "大家背诵圆周率3.1415926535" & vbNewLine & _
"珠穆朗玛峰高度8848.0" & vbNewLine & _
"光速是300000000米/秒" & vbNewLine & _
"马里亚纳海沟最大长度: 2550,平均深度: 8000," & vbNewLine & _
"最大宽度: 69,最大深度11034"
MsgBox strTxt & vbNewLine & vbNewLine & _
objRegEx.Replace(strTxt, "$1,")
Set objRegEx = Nothing
End Sub
结果如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/144f157105d2b64086719306a857c2c4.png)
相关博文链接:
VBA之正则表达式(1)-- 基础篇
VBA之正则表达式(2)-- 批量修改公式
VBA之正则表达式(3)-- 特殊公式计算
VBA之正则表达式(4)-- 提取日期和金额
VBA之正则表达式(5)-- 中文字符
VBA之正则表达式(6)-- 设置音标格式
VBA之正则表达式(7)-- 乾坤大挪移(数据整理)
VBA之正则表达式(8)-- 重复字符分组
VBA之正则表达式(9)-- 添加千分位(1/3)
VBA之正则表达式(10)-- 添加千分位(2/3)
VBA之正则表达式(11)-- 添加千分位(3/3)