实例需求:提取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
因此没有哪种匹配规则是万能的,需要大家根据实际应用场景选择合适的方案。