全民一起VBA实战篇 专题3 第三回 捕获组只按括号计数,正则式可以嵌套加强

 

相关知识点:

正则表达式

捕获组:使用圆括号,将匹配结果中的局部内容单独抽取出来。

(\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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值