VBA之正则表达式(10)
《添加千分位(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之后的位置,使用正则替换就可以简单的实现添加千分位的目的。这个正则的核心是如何消耗掉小数点及其之后的数字。

正则表达式有了,附上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
结果如下图所示。

赞 (0)