用VBA处理文本时,如果对确定的字符序列进行精确操作(查找、截取、替换),使用字符串处理函数 (如 InStr, Mid, Replace)完全够用;但当规则变得复杂,使用字符串函数会导致代码冗长混乱时,正则表达式(Regular Expression)就该登场了
认识正则表达式
正则表达式是处理文本的利器,它通过一种特殊的字符串模式,让我们能高效地完成复杂的搜索、匹配和替换任务。举个简单的例子感受一下:
假如在一段文本中提取订单号,订单号由1个字母后跟7位数字组成共8位。如“订单号:A1234567,请处理”
如果使用字符串函数实现,其核心逻辑则是遍历字符串中的每个字符,循环中使用 Mid 截取字符,Asc/Chr 判断字符类别,并拼接出符合长度和格式要求的字符串,这代码量就小不了
但如果使用正则表达式,轻轻松松几行代码拿下
With CreateObject("VBScript.RegExp").Global = True ' 搜索全部匹配项.IgnoreCase = False ' 区分大小写.Pattern = "[A-Z]\d{7}"Debug.Print .Execute("订单号:A1234567,请处理")(0)End With
执行后,直接提取出订单号:
是不是很神奇?接下来就逐步来学习这种新的文本处理方式吧
正则基本语法
正则表达式可以说是一项“一次学习,一生受益”的强大技能。初看可能第一印象就是复杂,给人一种望而生畏的感觉。而一旦掌握核心概念并多加练习,就会让我们处理文本的能力获得质的飞跃
想要理解正则表达式,关键在于掌握其构建模式的“语法”(即Pattern),它主要由以下几类元素构成:
2.1 普通字符
普通字符很好理解,其作用就是匹配自身,如字母、数字。虽然看起来基础,但它们是构建复杂匹配模式的基石,因为复杂的匹配模式通常由普通字符和特殊字符共同构成
当我们需要查找或验证文本中是否包含特定、确切的字符序列时(如特定的产品代码、关键词、人名),直接使用这些普通字符作为模式是最简单可靠的方式
假如需要将部门列表中部门名称中的“门”字移除(“销售部门”改为“销售部”),这个时候就可直接使用普通字符"门"作为匹配模式,如
.Pattern = "门"2.2 元字符
元字符是具有特殊功能的字符,是正则表达式的“关键字”,是构建匹配模式的核心,它们赋予了正则表达式强大的文本处理能力。例如上文代码中\d,含义是匹配一个数字字符,等价于 [0-9]。另外还有:
.匹配除换行符(\n、\r)外的任何单个字符
\D匹配一个非数字字符,等价于 [^0-9]
\w匹配字母、数字、下划线,等价于 [A-Za-z0-9_]
\W匹配非字母、数字、下划线的字符
\s匹配任何空白字符,包括空格、制表符、换页符等
\S匹配任何非空白字符
2.3 字符类
字符类是使用方括号 [] 定义一组字符,用于匹配该集合中的任意一个字符,匹配其中任意一个
例如:匹配所有元音字母(不区分大小写
.Pattern = "[aeiouAEIOU]"再比如:匹配所有非数字字符
.Pattern = "[^0-9]"2.4 量词
量词是控制其前面元素出现的次数,举例说明:
匹配连续出现至少2次的连字符 '-'
.Pattern = "-{2,}"精确匹配连续出现11次的数字,如手机号码
.Pattern = "\d{11}"2.5 边界匹配符
不匹配字符,而是匹配位置,比如字符串的开头、结尾,或者单词与非单词字符之间的边界,具体如下:
\b精确匹配单词而不是单词的一部分时极其有用
\B 匹配非单词边界,即两边同为单词字符或同为非单词字符的位置
$ 匹配字符串的结束位置。在多行模式下,也匹配每一行的结尾
^ 匹配字符串的开始位置
例如要匹配的内容从开头到结尾都是数字
.Pattern = "^\d+$"再比如只匹配单词 "red",不匹配 "redirect" 或 "bred"
.Pattern = "\bred\b"2.6 捕获组
用 () 括起来的部分,用于提取或重复特定子串
例如:第一个(\d{4})捕获组匹配年份,第二个(\d{2})捕获组匹配月份
.Pattern = "(\d{4})-(\d{2})了解了以上语法知识后,我们对正则有了初步的认知。回头再来看文章开始展示的代码,是不是就清晰多了?其中最关键的步骤就是下面这一行代码,它定义了一种匹配模式:1个字母后跟7位数字
.Pattern = "[A-Z]\d{7}"因此就轻松找到了文本中的订单号
结束语
今天的分享就到这里了,咱们下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号“努力鸭是黑色的”,解锁更多的VBA技能