VBA之正则表达式(30)-- 提取机构代码

49 篇文章 18 订阅
25 篇文章 2 订阅

实例需求:提取A列示例数据行末的机构代码,如下图所示。

在这里插入图片描述

示例数据:

1.1MERRILLLYNCH INTERNATIONAL一般机构21.563.22
1.2中国工商银行股份有限公司-天弘添利债券型证券投资基金(LOF)基金35.965.37
1.3中国工商银行-诺安平衡证券投资基金基金9.001.34
1.4博时价值回报固定收益型养老金产品-中国银行股份有限公司一般机构16.532.47
1.5吴丰礼–224.3533.48
1.6国寿养老稳健5号固定收益型养老金产品-中国工商银行股份有限公司一般机构14.782.21
1.7杨双保–35.505.30
1.8西北投资管理(香港)有限公司-西北飞龙基金有限公司一般机构20.002.98
1.9银华基金-交通银行-银华通赢1号集合资产管理计划一般机构13.492.01
1.10黄代波–28.544.26

示例代码如下:

Sub Demo1()
    Dim regExp As Object, regExpMHs As Object
    Set regExp = CreateObject("vbscript.regExp")
    regExp.Global = True
    regExp.Pattern = "\d+\.\d+\.\d+"
    arr = [a1].CurrentRegion.Value
    For i = 2 To UBound(arr)
        Set regExpMHs = regExp.Execute(arr(i, 1))
        If regExpMHs.Count > 0 Then
            arr(i, 2) = regExpMHs(0)
        End If
    Next
    [a1].CurrentRegion.Value = arr
    Set regExpMHs = Nothing
    Set regExp = Nothing
End Sub

代码解析:

第3行代码创建正则表达式对象。
第4行代码设置全局匹配。
第5行代码设置匹配规则。

正则表达式说明
\d+匹配一个或者多个数字
\.匹配一个英文半角句号

第6行代码将数据区域内容保存在数组中。
第7~12行代码使用For语句循环处理数据。
第8行代码执行正则匹配。
第9行代码判断是否匹配成功。
第10行代码将匹配结果保存在数组中。
第13行代码将数据写入工作表。
第14~15行代码清空对象变量,释放系统资源。

这个实例的正则规则并不复杂,接下来才是要讲的重点,正则匹配规则其实就是字符串规律的一种表达形式,上述代码使用三段数组以点号分隔,这个最直接的表达方式,观察一下示例数据,每行文字的起始处和结尾都是数字字符串,只要正则匹配模式能够区分二者的差异即可,代码可以简化。

Sub Demo2()
    Dim regExp As Object, regExpMHs As Object
    Set regExp = CreateObject("vbscript.regExp")
    regExp.Global = True
    regExp.Pattern = "[\d\.]{5,}"
    arr = [a1].CurrentRegion.Value
    For i = 2 To UBound(arr)
        Set regExpMHs = regExp.Execute(arr(i, 1))
        If regExpMHs.Count > 0 Then
            arr(i, 2) = regExpMHs(0)
        End If
    Next
    [a1].CurrentRegion.Value = arr
    Set regExpMHs = Nothing
    Set regExp = Nothing
End Sub

代码解析:
第5行设置匹配模式。

正则表达式说明
[\d\.]匹配数字或者英文半角句号
{5,}匹配至少5个字符

每行起始处的字符串虽然与要提取的类似,但是其最大长度为4,因此只有简单的限制匹配模式中的字符串长度就可以实现数据提取。

这种“偷懒”模式的好处是可以简化正匹配规则,带来的潜在问题是容易受到干扰,例如文本行起始处的数字编号位数增加,那么也就符合了匹配规则,如下所示。

10.10黄代波–28.544.26

因此没有哪种匹配规则是万能的,需要大家根据实际应用场景选择合适的方案。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值