2026/2/7 16:51:55
网站建设
项目流程
一网网站制作平台,外贸怎么用网站开发新客户,网站优化推广服务,一站式做网站系统上一期讲到了捕获组#xff0c;它尽职尽责地找到我们关心的文本模式#xff0c;并将其分门别类地记录到 SubMatches 集合中。然而#xff0c;当匹配逻辑变得复杂时#xff0c;这位“助手”过于细致的记录有时反而会成为一种负担什么是非捕获组为了卸下负担#xff0c;解决…上一期讲到了捕获组它尽职尽责地找到我们关心的文本模式并将其分门别类地记录到 SubMatches 集合中。然而当匹配逻辑变得复杂时这位“助手”过于细致的记录有时反而会成为一种负担什么是非捕获组为了卸下负担解决“只需分组、无需捕获”的需求非捕获组应运而生VBA正则表达式中的非捕获组是一个非常实用的分组工具可以帮助我们优化表达式结构并提升匹配效率其语法为(?:Expression)其中 Expression 是要进行分组的正则表达式通过预定义字符、字符类、量词等组合而成当我们需要使用圆括号 () 来对表达式进行分组但又不希望这个分组被单独捕获出来作为结果的一部分时可考虑使用非捕获组。这可以避免产生不必要的子匹配项使结果更清晰非捕获组 VS 捕获组为了直观理解非捕获组和捕获组的区别我们来看两段代码以下示例代码需求从文本中提取日期信息并分别输出完整的日期以及年、月、日三个部分这里需要用到捕获组Dim match 创建正则表达式对象With CreateObject(VBScript.RegExp).Global True 搜索全部匹配项.IgnoreCase False 区分大小写.Pattern (\d{4})-(\d{2})-(\d{2})For Each match In .Execute(合同签订时间2025-09-17生效日2025-10-15)Debug.Print matchDebug.Print match.SubMatches(0)Debug.Print match.SubMatches(1)Debug.Print match.SubMatches(2)NextEnd With代码的核心是要搜索的模式\d{4} 匹配4位数字年\d{2} 匹配2位数字月或日因此执行后结果从图中可以看出SubMatches中已经分别提取到了年、月和日这三个部分然而有些场景我们可能只关心月和日两个分组数据此时SubMatches就不需要存储年份相关的分组内容因此代码修改为Dim match 创建正则表达式对象With CreateObject(VBScript.RegExp).Global True 搜索全部匹配项.IgnoreCase False 区分大小写.Pattern (?:\d{4})-(\d{2})-(\d{2})For Each match In .Execute(合同签订时间2025-09-17生效日2025-10-15)Debug.Print matchDebug.Print match.SubMatches(0)Debug.Print match.SubMatches(1)NextEnd With匹配模式中(?:\d{4})即为非捕获组就是在捕获组基础上增加问号和冒号这两个符号它的作用是匹配但不捕获年份因此实际只有两个捕获组match.SubMatches(0)存放月如09match.SubMatches(1)存放日如17这样处理之后SubMatches结果中保留的均为目标数据有效排除了非必要分组信息的干扰总之将不需要引用的分组改为非捕获组是一个良好的编程习惯使代码逻辑变得清晰避免分组编号混乱。另外在非常复杂的正则表达式中将不需要引用的普通捕获组 () 改为非捕获组 (?:)还能带来性能提升结束语今天的分享就到这里了咱们下期继续公众号同时也在不间断地分享免费的编程案例如果想学习更多的编程知识无论是用来提升自动化办公效率还是想提升自我都可以关注我的公众号“努力鸭是黑色的”解锁更多的VBA技能