当前位置:首页>java>【Excel VBA 编程】正则表达式中,“$” 能饰演3种角色,别再被蒙骗了

【Excel VBA 编程】正则表达式中,“$” 能饰演3种角色,别再被蒙骗了

  • 2026-10-29 05:44:40
【Excel VBA 编程】正则表达式中,“$” 能饰演3种角色,别再被蒙骗了
“详细介绍正则表达式中“$”  的三种用法和实现功能”

总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!

终于有时间处理留言区内大家提出的问题了,咱就一个个回答哈

在VBA正则表达式中,$ 是一个多功能的元字符,扮演的角色决定了其实现功能,接下来就详细介绍它在VBA中所扮演的3种角色

行尾锚点

这是 $ 最基础且核心的用法。当它出现在正则表达式模式的末尾时,它是一个定位符(Anchor),用于匹配字符串的结束位置

也就是说,当 $ 作为定位符出现在模式末尾时,它匹配的是一个位置(即字符串的结束位置),而不是一个具体的字符。因此在单行模式匹配下,最终结果只有两个:要么成功匹配到(仅一次),要么匹配失败

1.1 单行模式匹配

示例1:匹配成功

    Dim match    With CreateObject("VBScript.RegExp")        .Global = True ' 搜索全部匹配项        .Pattern = "\d+$" ' 匹配末尾的数字        For Each match In .Execute("订单号是20260109")            Debug.Print match        Next    End With

执行以上代码立即窗口会输出一串数字,匹配成功

模式 \d+$匹配的是一个位于字符串结尾处、由一个或多个数字组成的子串。在字符串 “订单号是20260109” 中,通过\d匹配到数字 “20260109”,紧接着,定位符 $ 会检查这个匹配项的结束位置与整个字符串的结束位置重合,因此匹配成功,返回20260109

示例2:匹配失败

如果将示例1中的第5行代码改为:

For Each match In .Execute("20260109是订单号")

清空立即窗口内容,再次执行代码则不会显示任何内容,说明匹配失败

同样是模式 \d+$,在字符串 “20260109是订单号” 中,虽然能找到数字 “20260109”,但这个匹配项的结尾并非字符串的结尾(后面还有几个汉字),因此整个模式匹配失败

1.2 多行模式匹配

搞清楚了单行模式匹配,再来了解一下什么是多行模式匹配。虽然与本期主题不太相关,是题外话。但本着讲都讲了,也就不藏着掖着了,一次说清楚

简单来说多行匹配就是一次能匹配到多个结果,那么它是怎么做到的呢?直接看代码

示例3:通过多行模式,一次匹配多个结果

    Dim regEx As Object, strTest As String, match As Object    Set regEx = CreateObject("VBScript.RegExp")    ' 模式:匹配每行末尾的数字    regEx.Pattern = "\d+$"    regEx.Global = True       ' 全局搜索    regEx.Multiline = True    ' 多行模式,使$匹配行尾    ' 一个包含多行的字符串    strTest = "第一个订单号是20260107" & vbCrLf & _              "第二个订单号是20260108" & vbCrLf & _              "第三个订单号是20260109"    For Each match In regEx.Execute(strTest)        Debug.Print "订单号: " & match.Value '    Next

以上代码执行后,立即窗口会输出三个订单号:

原理很简单,由于启用了多行模式,$ 分别匹配了符串中每一行的行尾位置,因此执行了三次匹配

最后提醒,多行模式中别忘了将regEx.Global 设置为True

表示普通字符

$作为普通字符使用一般有以下两种情况

2.1 $在字符集内部

当 $ 出现在方括号 [] 定义的字符集(Character Class) 内部时,它失去了特殊含义,仅代表美元符号这个字符本身

示例4:$在方括号内部,只表示美元符号

    Dim match    With CreateObject("VBScript.RegExp")        .Global = True ' 搜索全部匹配项        .Pattern = "[\d$]+" '        For Each match In .Execute("335$,ass")            Debug.Print match        Next    End With

模式[\d$]+匹配一个或多个连续的字符,这些字符可以是数字(0-9)或美元符号($),执行后,立即窗口显示:

2.2 $前有转义符"\"

反斜杠 \ 是转义字符,它的主要作用是改变后续字符的含义。对于具有特殊功能的元字符,如 $,当它前面加上转义字符时,就会失去特殊含义,变成普通的字面字符

示例5:$前有转义符,只表示美元符号

    Dim match    With CreateObject("VBScript.RegExp")        .Global = True ' 搜索全部匹配项        .Pattern = "\d+\$" '        For Each match In .Execute("335$,ass8987")            Debug.Print match        Next    End With

模式\d+\$匹配一个或多个连续的数字并且后面紧跟着一个美元符号$,执行后,立即窗口显示:

与示例1代码中的行尾锚点非常的相像,千万别搞混了

替换模式中引用捕获组

在 RegExp.Replace 方法的第二个参数(替换字符串)中,$n(n为数字)用于反向引用正则表达式模式中定义的捕获组

示例6:

    Dim regEx As Object, strInput As String, strOutput As String    Set regEx = CreateObject("VBScript.RegExp")    regEx.Pattern = "(\d{4})-(\d{2})-(\d{2})" ' 捕获年、月、日    regEx.Global = True    strInput = "报告日期为2025-12-01,截止于2026-01-09。"    strOutput = regEx.Replace(strInput, "$3/$2/$1") ' 替换为 日/月/年    Debug.Print strOutput

其中:

第3行代码匹配模式中定义了3个捕获组,$1 对应年份,$2 对应月份,$3 对应日期

第6行代码中,$1, $2, $3按从左到右的顺序,分别引用第1个、第2个、第3个捕获组匹配到的内容。因此,最终结果显示:

这个功能可是非常强大的,经常用于复杂格式的重排和标准化文本

好了,今天的内容到此结束了,下期继续

公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号,解锁更多的VBA技能

最新文章

随机文章