相关知识点:
正则表达式
捕获组:使用圆括号,将匹配结果中的局部内容单独抽取出来。
(\d+)(-(\d+))+:作为分组,圆括号外的+是有意义的代表一个或多个捕获组
作为捕获功能,圆括号外的+是被忽略的,捕获组只是数圆括号的数量
非捕获组:
功能:让某个圆括号只用于分组,不捕获其中的内容。
方法:将(内容)改为(?:内容),例如:(\d+)(?:-(\d+))+
例1 提取电话号码
Sub match()
Dim i as long, s as string, myReg as object
Dim mymatches as object, mymatch as object
‘从B2取得原始文本内容
s=Range(“B2”).value
‘创建正则表达式对象
Set myReg=Creatobject(“vbscript.regexp”)
myReg.Global=True
‘设定正则式并执行
myReg.Pattern=”(\d+)-(\d+)”
set mymatches=myReg.execute(s)
‘循环读取每个匹配的电话号码,并将其中的两个捕获组
‘分别写在第一列和第二列中
i=8
For Each mymatch In mymatches
Cells(i,2)=mymatch.submatches(0) ‘submatches(0)第一个捕获组
Cells(i,3)=mymatch.submatches(1)
i=i+1
Next mymatch
End Sub
例2 提取电话号码,多级分机号或菜单(实际结果见下图)
Sub capdemo()
Dim i as long, s as string, myReg as object,j as long
Dim mymatches as object, mymatch as object
‘从B2取得原始文本内容
s=Range(“B2”).value
‘创建正则表达式对象
Set myReg=Creatobject(“vbscript.regexp”)
myReg.Global=True
‘设定正则式并执行
myReg.Pattern=”(\d+)(-(\d+))+”
set mymatches=myReg.execute(s)
‘循环读取每个匹配的电话号码,并将其中的两个捕获组
‘分别写在第一列和第二列中
i=7
For Each mymatch In mymatches
For j=0 To mymatch.submatches.Count-1
Cells(i,j+2)=mymatch.submatches(j) ‘submatches(j)第j+1个捕获组
Next j
i=i+1
Next mymatch
End Sub
例3 提取电话号码,多级分机号或菜单(分两级正则表达式来实现,不需要捕获组)
Sub capdemo1()
Dim i as long, s as string, j as long
Dim myReg1 as object, matches1 as object
Dim myReg2 as object, matches2 as object
‘从B2取得原始文本内容
s=Range(“B2”).value
‘创建第一个正则表达式对象,用于所有查找完整电话号码
Set myReg1=Creatobject(“vbscript.regexp”)
myReg1.Global=True
myReg1.Pattern=”(\d+)(-(\d+))+”
‘创建第二个正则表达式对象,用于在一个电话号码中查找连续数字
Set myReg2=Creatobject(“vbscript.regexp”)
myReg2.Global=True
myReg2.Pattern=” \d+”
‘执行第一个正则式,找出所有电话号码
set matches1=myReg.execute(s)
‘循环读取每个匹配的电话号码,并将其交给第二个正则式处理
For i=0 To matches1.count-1
‘对每一个找到的号码,执行第二个正则式,找到其中连续的数字
set matches2=myReg2.execute(matches(i).Value)
‘循环读取每一个连续数字,写入对应的行列位置
For j=0 To matches2.Count-1
Cells(i+7,j+2)= matches2(j) .Value
Next j
Next i
End Sub