为了匹配各种类型的字符,正则表达式中引入了元字符,为了解决匹配字符的个数,引入了量词,有时需要匹配单个字符,有时需要把字符串作为一个整体来匹配,所以我们还要学习一下分组。 如:abc{2,} 与 (abc){2,}是完全不同的两个匹配。 abc{2,},表示匹配abc,最后那个c出现至少两次,所以匹配出来的是abcc,abccc,abcccc,…… (abc){2,},把abc当作一个整体来匹配,至少出现两次,匹配出来的是abcabc,abcabcabc,…… 所以,在正则表达式中可以用()来进行分组,解决单个与整体的问题。 另外正则表达式中用“|”来表示或者的关系,比如,a|b,表示匹配a或者是b。 下面我们通过具体的案例来体会下上面所讲的内容。 案例一: 凡是两个VBA连在一起的保留一个VBA即可,不区分大小写。 代码如下: Sub 去除重复() Dim regx As Object Set regx = CreateObject('vbscript.regexp') With regx .Global = True .ignorecase = True '不区分大小写,false则区分大小写 .Pattern = '(VBA){2,}' [b1] = .Replace([a1], 'VBA') End With End Sub 本案例中VBA就作为一个整体进行匹配,所以用括号。另外我们还学习到了如何区分大小写,ignorecase = True '不区分大小写,false则区分大小写。 案例二: 把经理或者是总监替换为高管。 代码如下: Sub 替换() Dim regx As Object, rng As Range Set regx = CreateObject('vbscript.regexp') With regx .Global = True .Pattern = '总监|经理' For Each rng In [a2:a9] Cells(rng.Row, 2) = .Replace(rng, '高管') Next End With End Sub 本例中我们练习的是正则表达式中或的表达。 案例三: 筛选以上海或者北京开始,一办或者三办结束的内容。 代码如下: Sub 筛选() Dim regx As Object, rng As Range, mat, n, m Set regx = CreateObject('vbscript.regexp') With regx .Global = True .Pattern = '(上海|北京).*(一办|三办)' For Each rng In [a2:a28] Set mat = .Execute(rng) For Each m In mat n = n 1 Cells(n 1, 2) = m Next Next End With End Sub .Pattern = '(上海|北京).*(一办|三办)',(上海|北京)这个很好理解,北京或者上海,中间的点号是元字符,. 匹配除'\n'之外的任何单个字符,星号是量词,* 匹配前面的子表达式零次或多次,点号和星号结合就表示任意零个或者是单个或者是多个字符,后面的表示一办或者三办结束。 通过上面三个例子,我们可以感受到,元字符,量词,分组结合在一起,可以实现很强大的匹配功能。 今天的分享就到这里了! 想更深入的学习视频教程,请进入公众号后台菜单中了解详情! |
|