上一篇文章(参见文末的参考资料[1])提到,包含小数的字符串出现在文本末尾时,正则表达式的运行效果还是不太理想。由于小数部分符合匹配规则,因此,小数部分也添加了千分位。
前文使用的正则表达式如下:
((\.\d+[\w\W]*?)*?\d)(?=(\d{3})+(\D|$))
解决的一个思路是:既然目前的正则表达式可以过滤掉小数部分的数字,那我们可以在字符串末尾构成一个符合匹配规则的字符串(例如:8888),这样就可以把最后一个匹配组扩展到添加的后缀字符串中;正则替换完成后,去掉后缀字符串。注意,替换完成后,需要去掉的字符串长度增加一位,因为多了一个千分位。
原始文本:123456789.1234555
文本末尾添加四个8:123456789.12345558888
替换文本:$1,
结果:123,456,789.12345558,888
去掉8,888,得到:123,456,789.1234555
使用的VBA代码如下:
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
运行结果:
参考资料:
[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)