VBA中正则表达式之分组

论坛 期权论坛 期权     
米宏Office   2019-7-14 05:35   4339   0
我的目标:让中国的大学生走出校门的那一刻就已经具备这些Office技能,让职场人士能高效使用Office为其服务。支持鹏哥,也为自己加油!

为了匹配各种类型的字符,正则表达式中引入了元字符;为了解决匹配字符的个数,正则表达式中引入了量词;有时需要匹配单个字符,有时需要把字符串作为一个整体来匹配,所以正则表达式中又引入了一个概念,分组。


如:abc{2,} 与 (abc){2,}是两个完全不同的匹配。
abc{2,},表示匹配abc,最后那个c出现至少两次,所以匹配出来的是abcc,abccc,abcccc,……
(abc){2,},是把abc当作一个整体来匹配,至少出现两次,匹配出来的是abcabc,abcabcabc,……


在正则表达式中可以用()来进行分组,解决单个与整体匹配的问题。


另外正则表达式中用“|”来表示或者的关系,比如,a|b,表示匹配a或者是b。


下面我们通过具体的案例来体会下上面所讲的内容。


案例一:






要求:凡是两个VBA连在一起的保留一个VBA即可,不区分大小写。


代码如下:

  1. Sub 去除重复()
复制代码
  1. Dim regx As Object
复制代码
  1. Set regx = CreateObject("vbscript.regexp")
复制代码
  1. With regx
复制代码
  1.     .Global = True
复制代码
  1.     .ignorecase = True '不区分大小写,false则区分大小写
复制代码
  1.     .Pattern = "(VBA){2,}"
复制代码
  1.     [b1] = .Replace([a1], "VBA")
复制代码
  1. End With
复制代码
  1. End Sub
复制代码
向右滑动可以查看完整代码

本案例中“VBA”就作为一个整体进行匹配,所以用括号。另外我们还学习到了如何在匹配时区分大小写,ignorecase = True '不区分大小写,ignorecase =false则区分大小写。


案例二:





要求:把经理或者是总监替换为高管。


代码如下:

  1. Sub 替换()
复制代码
  1. Dim regx As Object, rng As Range
复制代码
  1. Set regx = CreateObject("vbscript.regexp")
复制代码
  1. With regx
复制代码
  1.     .Global = True
复制代码
  1.     .Pattern = "总监|经理"
复制代码
  1.     For Each rng In [a2:a9]
复制代码
  1.           Cells(rng.Row, 2) = .Replace(rng, "高管")
复制代码
  1.     Next
复制代码
  1. End With
复制代码
  1. End Sub
复制代码
向右滑动可以查看完整代码

本例中我们练习的是正则表达式中"或"的表达。


案例三:





要求:筛选出上海或者北京开始,一办或者三办结束的内容。


代码如下:

  1. Sub 筛选()
复制代码
  1. Dim regx As Object, rng As Range, mat, n, m
复制代码
  1. Set regx = CreateObject("vbscript.regexp")
复制代码
  1. With regx
复制代码
  1.     .Global = True
复制代码
  1.     .Pattern = "(上海|北京).*(一办|三办)"
复制代码
  1.     For Each rng In [a2:a28]
复制代码
  1.     Set mat = .Execute(rng)
复制代码
  1.         For Each m In mat
复制代码
  1.               n = n + 1
复制代码
  1.               Cells(n + 1, 2) = m
复制代码
  1.         Next
复制代码
  1.     Next
复制代码
  1. End With
复制代码
  1. End Sub
复制代码
向右滑动可以查看完整代码

.Pattern = "(上海|北京).*(一办|三办)",(上海|北京)这个很好理解,北京或者上海,中间的点号是元字符,“. ” 号匹配除"\n"之外的任何单个字符,星号是量词,“*” 匹配前面的子表达式零次或多次,点号和星号结合就表示任意零个或者是单个或者是多个字符,后面的(一办|三办)表示一办或者三办结束。

通过上面三个例子,我们可以感受到,元字符,量词,分组结合在一起,可以实现很强大的匹配功能。

本节的分享就到这里,鹏哥祝大家每天都有进步。

加入米宏Office培训群,每天进步一点点!
从基础操作到VBA,
两杯咖啡的钱,
换取一份如此详细的Excel视频资料,
你还在犹豫?
欲购从速,联系微信号:527240310
非诚勿扰!
每天进步一点,每天提升一点!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:75
帖子:15
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP