上一篇文章(参见文末的参考资料[1])提到,简单合并正则表达式的运行结果并不理想,问题在于小数部分也可能匹配到。
2 继续试错
目前的重点是如何过滤到小数部分的数字,使之不被捕获。使用如下的正则表达式:
代码语言:javascript复制((.d [wW]*?)*?d)(?=(d{3}) (D|$))
(1)?=(d{3}) (D|),顺序肯定环视,所在位置的右侧,连续数字字符的个数是三的整数倍;并且其后跟随一个非数字字符,或者结束标识符。D,表示非数字字符。
(2).d [wW]*?
,也就是捕获组$2
。小数点后至少跟一个数字,非贪心匹配任意数量的任意字符(可以有,也可以没有)。w
匹配字母和数字;W
匹配非字母和非数字。[wW]
就是匹配任意字符。多提一句,字符.
,匹配的是任意字符,但换行符除外。
(3)($2)*?d
,匹配任意数量的匹配组2,后跟一个数字。也就是说,可以有或者没有小数点。
运行效果:
代码语言:javascript复制文本1:123456789
替换文本:$1,
结果:123,456,789
代码语言:javascript复制文本2:
圆周率3.1415926535
珠穆朗玛峰高度8848.0
替换文本:$1,
结果:
圆周率3.1415926535
珠穆朗玛峰高度8,848.0
代码语言:javascript复制文本3:1234576.7898
替换文本:$1,
结果:1,234,576.7,898
可以看出,包含小数的字符串出现在文本末尾时,正则表达式的运行效果还是不太理想。由于小数部分符合匹配规则,因此,小数部分也添加了千分位。
(未完待续)
参考资料:
[1] VBA:正则表达式(9) -添加千分位(1/3)
[2] 正则测试(https://tool.chinaz.com/regex)
[3] VBA之正则表达式(10)-- 添加千分位(2/3)(https://blog.csdn.net/taller_2000/article/details/89792241)