实例需求:只提取字符串中2位~4位的数字(无小数点),提取结果为蓝色数字。
测试字符串:6688-部门员工共10人与2019年6月成功完成销售额889966订单数689
这次的话题有些太简单了吧!?任何学习正则的同学基本上首先学会的就是这个知识点,一起回顾一下。
匹配数字有两种表示方法:
- [0-9]
- \d
2位~4位指的是数字字符的重复次数,可以用\d\d|\d\d\d|\d\d\d\d
,重复次数比较少,组合也不多,这样还可以,其实应该用大括号\d{2,4}
,注意不是{2-4}
。
正则表达式已经有了,如果我说这次讲解到结束,接下来是掌声还是鸡蛋呢 … …
用代码测试一下效果吧。
Sub GetDigits()
Dim strTxt As String
Dim objRE As Object
Dim objMH As Object
strTxt = "6688-部门员工共10人与2019年6月成功完成销售额889966订单数689"
Set objRE = CreateObject("vbscript.regexp")
objRE.Global = True
objRE.Pattern = "(\d{2,4})"
For Each objMH In objRE.Execute(strTxt)
Debug.Print objMH.submatches(0)
Next
End Sub
结果如下:
6688
10
2019
8899
66
689
输出结果中为什么有8899
和66
?889966
怎么被五马分尸了,正则不靠谱呀!
其实这个6位数字被分为两次匹配成功,\d{4}
匹配8899
,\d{2}
匹配66
。
看来需要修改正则表达式,既然提取指定位数的数字,那么潜台词就是说提取的数字组之前和之后都不是数字,幸好记得 \D
可以匹配非数字,修改一句代码如下。
objRE.Pattern = "\D+(\d{2,4})\D+"
再次测试代码,结果如下:
10
为嘛结果只有一个数字了,6688
和689
怎么不见了。 \D
可以匹配非数字是正确的,但是不能用于匹配字符串的开始位置和结尾位置,所以头和尾的数字不符合匹配模式,只能再修改匹配模式了。
最终的示例代码如下。
Sub GetDigits()
Dim strTxt As String
Dim objRE As Object
Dim objMH As Object
strTxt = "6688-部门员工共10人与2019年6月成功完成销售额889966订单数689"
Set objRE = CreateObject("vbscript.regexp")
objRE.Global = True
objRE.Pattern = "(?:^|\D)(\d{2,4})(?=\D|$)"
For Each objMH In objRE.Execute(strTxt)
Debug.Print objMH.submatches(0)
Next
End Sub
结果如下:
6688
10
2019
689
终于得到了正确结果,貌似一个简单的小问题,实际上用到的知识点还真不少。