news 2025/12/31 7:21:57

【Excel VBA 编程】第55讲:文本世界的万能钥匙——正则表达式Regex登场

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Excel VBA 编程】第55讲:文本世界的万能钥匙——正则表达式Regex登场

用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技能

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/25 13:00:01

RPA 重塑 IT 运维:6 大核心场景解锁自动化新效能

在数字化时代,IT 运维是企业业务连续运转的 “生命线”,但服务器监控、数据备份、日志分析等重复性工作,长期占用 IT 人员大量精力,传统人工模式不仅效率低下,还易因疲劳操作引发系统故障或安全风险。RPA(R…

作者头像 李华
网站建设 2025/12/11 23:56:15

C++设计模式大乱斗:让代码不再“乱炖”(一)

文章目录1. 造人派(创建型)1.1 单例模式(Singleton):朕的江山只有一位!干啥用?核心奥义猫哥上代码猫哥点评1.2 工厂模式(Factory):对象量产流水线&#xff01…

作者头像 李华
网站建设 2025/12/11 23:52:48

【time-rs】time-core 中的 convert.rs 文件详解

概述 这个文件是 time-core crate 中的时间单位转换模块,采用编译时计算的零成本抽象设计。它定义了一系列时间单位类型(如纳秒、微秒等)和它们之间的转换关系。 1. 设计哲学 零成本抽象 编译时计算:所有转换系数在编译时确定无运…

作者头像 李华