正则表达式,常被用来检验、替换符合某个模式(规则)的字符串,在代码中常缩写为regexp
。VBA中并没有直接提供正则表达式的对象,需要借助VBScript
的正则对象。
如果使用前期绑定,那么就需要在VBE中引用如下扩展库。
也可以使用后期绑定的方式创建正则对象,代码如下:
Set objRegEx = CreateObject("vbscript.regexp")
正则对象有四个属性和三个方法。
属性:
方法:
待处理的文本如下,提取其中的姓名汉字和电话数字。
Name:张三丰,Phone:13801380000
VBA代码如下:
Option Explicit
Sub RegExpDemoSyntax()
Dim objRegEx As Object, myString As String, objMH As Object, retStr As String
Set objRegEx = CreateObject("vbscript.regexp")
objRegEx.Pattern = "Name:(.*?),Phone:(\d+)"
objRegEx.Global = True
myString = "Name:张三丰,Phone:13801380000"
Set objMH = objRegEx.Execute(myString)
If objMH.Count > 0 Then
With objMH(0)
retStr = "名字:" & .SubMatches(0) & vbNewLine
retStr = retStr & "电话号码:" & .SubMatches(1)
MsgBox retStr
End With
End If
Set objRegEx = Nothing
End Sub
运行结果:
重点解析:
(1)Execute – 对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。
(2)匹配到的所有对象放在MatchCollection
集合中,这个集合对象只有两个只读属性:
Index
值获取指定的元素。一般,可以使用ForEach
语句枚举集合中的对象。集合中对象的类型是Match。(3)Match对象有以下几个只读的属性:
(4).*?
一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。
(5).*
具有贪婪的性质,匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。
(6)+
匹配一次或多次前面的分组。
参考资料:
[1] VBA之正则表达式(1)-- 基础篇(https://blog.csdn.net/taller_2000/article/details/88088378)
[2] vba正则表达式入门(https://yshblog.com/blog/94)
[3] 正则里的(.*?)是什么意思(https://blog.csdn.net/WuLex/article/details/88563332)
[4] SubMatches Collection(https://www.vbsedit.com/html/e84ef1f4-dc6f-4d30-8b5d-dd452efec2d5.asp)
[5] excel vba regex functions(https://juejin.cn/s/excel%20vba%20regex%20functions)
[6] 简明Excel VBA(四)正则表达式(Regular Expression)(https://www.jianshu.com/p/3e0b4620bbb6)