幾個(gè)經(jīng)典案例徹底講明白正則表達(dá)式在VBA中到底如何用
一、為什么要在 VBA 中用正則表達(dá)式?
Excel/VBA 原生的字符串函數(shù)(如 InStr、Replace、Split 等)適用于簡(jiǎn)單情況,但面對(duì)以下場(chǎng)景時(shí)會(huì)顯得力不從心:
- 復(fù)雜格式驗(yàn)證(郵箱、手機(jī)號(hào)、身份證等)
- 從非結(jié)構(gòu)化文本中批量提取特定信息
- 基于模式執(zhí)行替換(例如批量格式化內(nèi)容)
- 處理日志、HTML 等不規(guī)則字符串
這時(shí),正則表達(dá)式(RegEx) 是唯一高效、靈活的解決方案,關(guān)于正則表達(dá)式的具體語(yǔ)法,我這里就不再多提,因?yàn)槲抑皩戇^(guò)一篇關(guān)于正則表達(dá)式的系統(tǒng)梳理,如有需要可以到主頁(yè)查閱,本文我們關(guān)注如何在VBA中使用正則表達(dá)式。
二、啟用正則表達(dá)式支持(引用庫(kù) / 綁定規(guī)則)
方法 1 — 前期綁定
- 打開 VBA 編輯器(
Alt + F11) - 選擇上方菜單:工具 → 引用
- 找到并勾選 Microsoft VBScript Regular Expressions 5.5

注意還有一個(gè)版本是1.0的,不要勾選那個(gè),正確啟用后,VBA 能識(shí)別 RegExp 類型,并有智能提示,如下:

方法 2 — 后期綁定
無(wú)需手動(dòng)引用庫(kù),兼容性更好,尤其適合分發(fā)到多臺(tái)電腦,這種方式不會(huì)觸發(fā)“缺少引用”的錯(cuò)誤:
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")
三、RegExp 對(duì)象核心屬性與方法
在 VBA 中操作正則表達(dá)式的核心,就是 RegExp 對(duì)象,它具有幾個(gè)關(guān)鍵屬性和方法,總結(jié)如下:
| 屬性 | 說(shuō)明 |
|---|---|
.Pattern | 要匹配的正則字符串 |
.Global | 是否全局匹配(查找所有匹配項(xiàng)) |
.IgnoreCase | 是否忽略大小寫 |
.MultiLine | 多行模式(^/$ 對(duì)更多行有效) |
而方法主要有驗(yàn)證,提取和替換三種,具體表示為:
Test(str):判斷字符串是否匹配模式,匹配模式由.Pattern給出具體表達(dá)式Execute(str):返回所有匹配項(xiàng)集合Replace(str, repl):替換匹配到的內(nèi)容
四、核心用法示例
4.1 驗(yàn)證模式:判斷是否匹配
用途: 通常用來(lái)檢查字符串是否符合某種規(guī)則或格式,比如下方檢測(cè)是否滿足日期格式,.Test 返回 True/False
Sub ValidatePattern()
Dim re As Object
Set re = CreateObject("VBScript.RegExp") '創(chuàng)建正則表達(dá)式對(duì)象
With re
.Pattern = "^\d{4}-\d{2}-\d{2}$"
.IgnoreCase = True '忽略大小寫
End With
Dim s As String
s = "2025-12-31"
If re.Test(s) Then
Debug.Print s & " 格式正確"
Else
Debug.Print s & " 格式錯(cuò)誤"
End If
End Sub
4.2 匹配提?。赫业剿衅ヅ漤?xiàng)
用途: 從文本中提取所有符合模式的片段,.Execute 返回一個(gè)集合,其中每個(gè) Match 都有 .Value 屬性
Sub ExtractMatches()
Dim re As Object, matches As Object, m
Dim text As String
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+" '匹配一個(gè)或多個(gè)數(shù)字
re.Global = True
text = "訂單編號(hào): 12, 客戶編號(hào): 45, 數(shù)量: 67"
Set matches = re.Execute(text)
For Each m In matches '遍歷所有匹配項(xiàng)
Debug.Print "匹配項(xiàng): " & m.Value
Next
End Sub
4.3 批量替換:按模式替換字符串
用途: 按規(guī)則修改文本內(nèi)容,比 Replace 更強(qiáng)、更靈活,比如以下代碼輸出 “dog dog catfish dog”
Sub ReplaceText()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\bcat\b" '匹配獨(dú)立的單詞"cat"
re.Global = True
Dim s As String
s = "cat dog catfish cat" '包含多個(gè)"cat", 只有獨(dú)立的"cat"會(huì)被替換
Dim result As String
result = re.Replace(s, "dog") '返回替換后的字符串
Debug.Print result
End Sub
4.4 多行規(guī)則:行首行尾界定
在處理 Excel 單元格、批量說(shuō)明文本時(shí),字符串往往是“多行”的,而這時(shí)很多人會(huì)發(fā)現(xiàn):明明正則寫對(duì)了,卻怎么也匹配不到?,根本原因通常只有一個(gè):沒有正確理解或啟用 MultiLine 模式。
需要記得:
.MultiLine = False(默認(rèn)):只匹配整個(gè)字符串的開頭 / 結(jié)尾.MultiLine = True:匹配 每一行 的開頭 / 結(jié)尾
例如我們看下面這個(gè)例子,在這里,文本部分代表的是:
ID:1001 Name:Tom
ID:1002 Name:Jerry
ID:1003 Name:Alice
這個(gè)是一個(gè)多行的內(nèi)容,如果我們采用re.MultiLine = False,則這里只會(huì)提取到第一個(gè)1001,因?yàn)槭前凑麄€(gè)字符串提取的
Sub Demo_MultiLine_False()
Dim re As Object, mc As Object, m
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^ID:(\d+)"
re.Global = True
re.MultiLine = False ' 默認(rèn)值
Dim txt As String
txt = "ID:1001 Name:Tom" & vbCrLf & _
"ID:1002 Name:Jerry" & vbCrLf & _
"ID:1003 Name:Alice"
Set mc = re.Execute(txt)
For Each m In mc
Debug.Print m.SubMatches(0)
Next
End Sub
而如果我們?cè)O(shè)置 re.MultiLine = True,就能將三個(gè)數(shù)字完整地都提取出來(lái)。
五、兩大典型實(shí)戰(zhàn)示例
在本節(jié),我們看看兩個(gè)經(jīng)典的案例,比如在第一個(gè)例子中我們對(duì)選中的單元格逐個(gè)運(yùn)行正則提取,提取郵箱
5.1 從單元格批量提取郵箱
Sub ExtractEmailsFromRange()
Dim re As Object, mc As Object, m
Dim r As Range, cell
Set re = CreateObject("VBScript.RegExp")
' 匹配電子郵件地址的正則表達(dá)式
re.Pattern = "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
re.Global = True
' 遍歷選中的單元格,提取郵箱地址
For Each cell In Selection
If re.Test(cell.Value) Then
Set mc = re.Execute(cell.Value)
For Each m In mc
Debug.Print "Found Email: " & m.Value
Next
End If
Next
End Sub
5.2 刪除字符串中的重復(fù)單詞
我們?cè)?code>pattern中對(duì)組的表達(dá)可以是\1的形式,但是在具體方法中捕獲,利用捕獲組 $1 實(shí)現(xiàn)替換
Sub RemoveDuplicateWords()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' 匹配重復(fù)單詞的正則表達(dá)式
re.Pattern = "\b(\w+)\b\s+\b\1\b"
re.Global = True
Dim s As String
s = "hello hello world world"
' 替換重復(fù)單詞為第一個(gè)單詞
Debug.Print re.Replace(s, "$1")
End Sub
VBA 本身并不原生支持正則表達(dá)式語(yǔ)法,但通過(guò) VBScript RegExp 對(duì)象的引入,可以方便我們對(duì)復(fù)雜字符串的處理.
總結(jié)
到此這篇關(guān)于幾個(gè)經(jīng)典案例徹底講明白正則表達(dá)式在VBA中到底如何用的文章就介紹到這了,更多相關(guān)VBA中正則表達(dá)式使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript正則表達(dá)式和字符串RegExp and String(二)
這篇文章主要介紹了javascript正則表達(dá)式和字符串RegExp and String的相關(guān)資料,需要的朋友可以參考下2015-10-10
ASP超級(jí)鏈接和HTML函數(shù)正則表達(dá)式 修正版
ASP超級(jí)鏈接和HTML函數(shù) 正則表達(dá)式的使用,最后一個(gè)實(shí)例經(jīng)過(guò)測(cè)試。2010-01-01
正則表達(dá)式.號(hào)元字符(除了回車符\r和換行符\n)
這篇文章主要介紹了正則表達(dá)式.號(hào)元字符(除了回車符\r和換行符\n),需要的朋友可以參考下2016-12-12
手機(jī)號(hào)碼驗(yàn)證方法(正則驗(yàn)證)
這篇文章主要介紹了手機(jī)號(hào)碼驗(yàn)證方法(正則驗(yàn)證),在文章中還給大家補(bǔ)充了最新手機(jī)號(hào)的驗(yàn)證正則表達(dá)式,需要的朋友可以參考下2017-02-02

