“详细介绍正则表达式中“$” 的三种用法和实现功能”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
终于有时间处理留言区内大家提出的问题了,咱就一个个回答哈
在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个捕获组匹配到的内容。因此,最终结果显示:
这个功能可是非常强大的,经常用于复杂格式的重排和标准化文本
好了,今天的内容到此结束了,下期继续