最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

幾個(gè)經(jīng)典案例徹底講明白正則表達(dá)式在VBA中到底如何用

 更新時(shí)間:2026年05月15日 10:30:17   作者:杰瑞不懂代碼  
工作中可能會(huì)面對(duì)需要提取文本中數(shù)字的場(chǎng)景,尤其數(shù)據(jù)行數(shù)較多時(shí),利用VBA正則表達(dá)式將會(huì)大幅度提升工作效率,這篇文章主要介紹了正則表達(dá)式在VBA中到底如何用的相關(guān)資料,文中通過幾個(gè)經(jīng)典案例講的非常詳細(xì),需要的朋友可以參考下

一、為什么要在 VBA 中用正則表達(dá)式?

Excel/VBA 原生的字符串函數(shù)(如 InStr、ReplaceSplit 等)適用于簡單情況,但面對(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àn)槲抑皩戇^一篇關(guān)于正則表達(dá)式的系統(tǒng)梳理,如有需要可以到主頁查閱,本文我們關(guān)注如何在VBA中使用正則表達(dá)式。

二、啟用正則表達(dá)式支持(引用庫 / 綁定規(guī)則)

方法 1 — 前期綁定

  1. 打開 VBA 編輯器(Alt + F11
  2. 選擇上方菜單:工具 → 引用
  3. 找到并勾選 Microsoft VBScript Regular Expressions 5.5

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

方法 2 — 后期綁定

無需手動(dòng)引用庫,兼容性更好,尤其適合分發(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é)如下:

屬性說明
.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)證模式:判斷是否匹配

用途: 通常用來檢查字符串是否符合某種規(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 單元格、批量說明文本時(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ù)字完整地都提取出來。

五、兩大典型實(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á)式語法,但通過 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)文章

最新評(píng)論

铜陵市| 营口市| 韶关市| 渭南市| 垦利县| 乌鲁木齐县| 江永县| 万州区| 苗栗市| 文成县| 衡阳市| 河源市| 龙游县| 祁门县| 集贤县| 鱼台县| 茂名市| 肇源县| 乳源| 体育| 赤城县| 平罗县| 纳雍县| 资兴市| 鄄城县| 桦南县| 梨树县| 宝兴县| 闽清县| 长治市| 东兴市| 普陀区| 揭东县| 晋州市| 北碚区| 天津市| 阿鲁科尔沁旗| 灵宝市| 峡江县| 顺平县| 陆丰市|