VBA之正则表达式(14)-- 提取指定位数的数字

本文深入探讨VBA中使用正则表达式提取特定长度数字的方法,通过实例解析正则表达式的复杂性和匹配模式的调整技巧,适合希望提升VBA编程技能的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例需求:只提取字符串中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

输出结果中为什么有889966889966怎么被五马分尸了,正则不靠谱呀!
其实这个6位数字被分为两次匹配成功,\d{4}匹配8899\d{2}匹配66
在这里插入图片描述
看来需要修改正则表达式,既然提取指定位数的数字,那么潜台词就是说提取的数字组之前和之后都不是数字,幸好记得 \D可以匹配非数字,修改一句代码如下。

objRE.Pattern = "\D+(\d{2,4})\D+"

再次测试代码,结果如下:

10

为嘛结果只有一个数字了,6688689怎么不见了。 \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

终于得到了正确结果,貌似一个简单的小问题,实际上用到的知识点还真不少。


相关博文链接:
VBA之正则表达式(12)-- 格式调整
VBA之正则表达式(13)-- 字符串变换
VBA之正则表达式(14)-- 提取指定位数的数字
VBA之正则表达式(15)-- 提取数字求和
VBA之正则表达式(16)-- 提取非重复值
VBA之正则表达式(17)-- 提取多组数据(去除末尾字符)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值