通配符模式 ≠ 正则表达式
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 公式里(COUNTIF、VLOOKUP 等)支持 * 和 ?,不支持字符类 [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 处理后导回 |
