第四章 正则表达式
4.8 分组匹配
把正则表达式放到括号里,就是分组匹配。
1、需要对一组字符串多次进行匹配,但元字符量词只对其前面的单个字符起作用,这时可以把这组字符用小括号括起来,再加上元字符量词。如:
(excel){2} 匹配“excel”字符串连续出现2次的情况,如:“excelexcel”,匹配结果如下:
匹配到一个记录“excelexcel”,其中匹配组为“excel”。
2、用正则表达式匹配出一个结果,但我们需要对这个结果的某个部分或把这个结果分成几个部分来操作,这时也可以用小括号把正则表达式分成几段,也就是分成几组来匹配。如:
2022-03-29-18-02-31
对这个字符串,用(\d{4}-\d{2}-\d{2})-(\d{2})-(\d{2})-(\d{2})来匹配,分日期、时、分、秒四组,这样会得到一个匹配结果,并且里面有4个匹配组,分别是2022-03-29、18、02和31,可以用:结果(0).SubMatches(0)、结果(0).SubMatches(1)、结果(0).SubMatches(2)、结果(0).SubMatches(3)来提取4个匹配组(第一个分组从0开始)。
只有一个匹配结果,但我们只需要匹配结果的一部分,也可以把这部分的正则表达式用小括号括起来,在语句里只提取这部分匹配结果来使用。
3、正则表达式需要多个条件,可以用小括号把每个条件括起来。如:
.Pattern = "(钱|赵)(大|小)[一-龢]”
在姓名列里找出姓是钱或赵,中间是大或小的,姓名是三个字的名字。
小程序:
把下面表格里的姓名及序号提取出来。
1.钱大2赵二3.王小虎4.李三5.孙全6周鱼
Sub 分组匹配()
Dim reg As New RegExp
With reg
.Global = True
.Pattern = "(\d+)\.?([一-龢]+)"
Set 结果 = .Execute([a1])
End With
For Each ss In 结果
[a1].offset(n, 1) = ss.SubMatches(0)
[a1].offset(n, 2) = ss.SubMatches(1)
n = n + 1
Next
End Sub
正则表达式"(\d+)\.?([一-龢]+)"分为序号数字和姓名两个分组,中间匹配上的“.”我们不用。通过查看本地窗口我们发现,正则表达式匹配的每个结果(Item)下面,都有一个SubMatches,它里面就是分组匹配的结果。如Item1,匹配结果是“1.钱大”,下面两个分组匹配结果分别是“1”和“钱大”。
运行后得到如下结果:
1.钱大2赵二3.王小虎4.李三5.孙全6周鱼 | 1 | 钱大 |
2 | 赵二 | |
3 | 王小虎 | |
4 | 李三 | |
5 | 孙全 | |
6 | 周鱼 |
往期精彩回顾:
学习VBA,报表做到飞 第四章 正则表达式 4.7 首尾匹配
学习VBA,报表做到飞 第四章 正则表达式 4.6 排除匹配
学习VBA,报表做到飞 第四章 正则表达式 4.5 Replace与Test
我是云飞扬,职场财会人员,愿与大家分享表格制作和数据统计分析的技巧与方法,希望大家的工作更便捷,更轻松!