Word / Excel 查找替换:通配符模式 vs 真正的正则,VBA RegExp 方案

通配符模式 ≠ 正则表达式

Office 自带的查找替换开启”使用通配符”后,支持的是简化版通配符,不是标准正则(PCRE / ECMAScript)。

功能通配符模式标准正则
任意字符*.*
单个字符?.
数字字符类[0-9]\d
字母字符类[A-Za-z]\w(有差异)
排除字符[!abc][^abc]
捕获组() + \1() + $1
懒惰匹配❌ 不支持*?
零宽断言❌ 不支持(?=...)
\d+ 数字简写❌ 不支持

Word 通配符示例

在 Word 查找替换中勾选”使用通配符”:

# 删除行首的数字编号(如 "1. " "12. ")
查找: [0-9]{1,}. 
替换: (留空)

# 把 "第X章" 中的数字替换为"第一章"形式——仅捕获数字
查找: (第)[0-9]{1,}(章)
替换: \1一\2

# 删除括号内的内容(非嵌套)
查找: \([!)]*\)
替换: (留空)

Word 通配符中 {n,m} 表示重复次数,不是标准正则的 {n,m}

Excel 原生通配符(非查找替换)

Excel 公式里(COUNTIFVLOOKUP 等)支持 *?,不支持字符类 [0-9]

=COUNTIF(A:A,"*错误*")   ' 包含"错误"的单元格数
=COUNTIF(A:A,"????")     ' 恰好4个字符

查找替换对话框(Ctrl+H)同理,勾选”单元格匹配”后才能精确匹配整个单元格。

VBA 实现真正的正则(推荐)

在 Excel 里按 Alt+F11 打开 VBE,插入模块:

' 正则替换函数(可在单元格直接使用)
Function RegReplace(text As String, pattern As String, replacement As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = False
        .Pattern = pattern
        RegReplace = .Replace(text, replacement)
    End With
End Function

' 正则匹配提取函数
Function RegExtract(text As String, pattern As String) As String
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = pattern
    re.Global = False
    If re.Test(text) Then
        RegExtract = re.Execute(text)(0).Value
    Else
        RegExtract = ""
    End If
End Function

单元格用法:

=RegReplace(A1,"\d+","[数字]")       ' 把数字替换为[数字]
=RegReplace(A1,"^\s+|\s+$","")       ' 去首尾空格(等价于 TRIM)
=RegExtract(A1,"\d{11}")             ' 提取11位手机号
=RegExtract(A1,"[一-龥]+")   ' 提取第一段中文

批量替换整列:

Sub BatchRegReplace()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.Pattern = "\s+"          ' 合并多个空格

    Dim cell As Range
    For Each cell In Range("A1:A100")
        If cell.Value <> "" Then
            cell.Value = re.Replace(cell.Value, " ")
        End If
    Next cell
End Sub

Power Query 方案

Excel → 数据 → 获取数据 → 启动 Power Query 编辑器,M 语言示例:

// 提取列中的数字
= Table.TransformColumns(
    Source,
    {{"Column1", each Text.Select(_, {"0".."9"}), type text}}
  )

// 删除非字母数字字符
= Table.TransformColumns(
    Source,
    {{"Column1", each Text.Select(_, {"A".."Z","a".."z","0".."9"}), type text}}
  )

Power Query 不支持完整正则,但 Text.Select / Text.Remove 加字符范围可覆盖大多数清洗需求。

Word 宏调用正则

Sub WordRegexReplace()
    Dim re As Object
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.Pattern = "\b\d{4}-\d{2}-\d{2}\b"    ' 匹配日期格式 YYYY-MM-DD

    Dim doc As Document
    Set doc = ActiveDocument

    Dim para As Paragraph
    For Each para In doc.Paragraphs
        para.Range.Text = re.Replace(para.Range.Text, "[日期]")
    Next para
End Sub

选择建议

场景方案
简单通配(含*/?/字符类)查找替换 + 通配符
\d+ 等 PCRE 语法VBA + VBScript.RegExp
大批量数据清洗Power Query
需要留存为可复用公式RegReplace 自定义函数
对正则有复杂要求导出 CSV → Python / Node.js 处理后导回