你从系统里导出的客户表,常常惨不忍睹:电话号码四种格式混着写、客户姓名是”姓,名”倒着存、订单号十二行里有五行不合规范。过去只能写一长串嵌套公式去硬抠字符位置,供应商前缀一变,后面每层判断跟着全错。

一位 MakeUseOf 撰稿人分享,他用 REGEXTEST、REGEXEXTRACT、REGEXREPLACE 三个新函数,把写了多年的复杂清洗公式退役了。这三个函数只在 Excel for Microsoft 365 和 Excel 网页版里提供,Excel 2021、2024 等买断版并没有,动手前先确认自己的版本。
一、REGEXTEST:一行公式校验整列
- 在单元格输入
=REGEXTEST(文本, 正则, [是否区分大小写])。”文本”填要检查的单元格或区域;”正则”用一段简写描述”合法长相”;第三个参数默认 0 表示区分大小写,填 1 则不区分。 - 例如订单号规则是”三位大写字母+连字符+四位数字”,公式写为
=REGEXTEST(A2, "^[A-Z]{3}-[0-9]{4}$")。^ 和 $ 把匹配钉在字符串首尾,[A-Z]{3}表示三个大写字母,[0-9]{4}表示四位数字。 - 过去校验同样的订单号,要套四层 LEN、MID、ISNUMBER、EXACT 嵌套;一旦供应商前缀变成五位字母,后面每层判断都会跟着错。改用正则后,描述的是形状而非数位置,前缀长度变化也不影响。
二、REGEXEXTRACT:不数字符也能取值
- 函数写法
=REGEXEXTRACT(文本, 正则, [返回模式], [是否区分大小写])。返回模式填 0 取首个匹配、1 取全部、2 取首个匹配里的捕获组。 - 产品编码形如 ELEC-NORTH-4471-A,中间四位数字是订单号,但前缀有时四个字有时六个字,永远不在同一位置。公式
=REGEXEXTRACT(D2, "[0-9]{4}")即可,不用锚点,让 Excel 扫描出第一组连续四位数字。 - 注意三个函数返回的都是文本,要拿去加总时记得用 VALUE 函数包一层转成数字。
三、REGEXREPLACE:多层嵌套塌成一行
- 写法
=REGEXREPLACE(文本, 正则, 替换值, [第几次出现], [是否区分大小写])。替换值留空引号 “” 即删除匹配内容。 - 电话号里混着括号、点、空格、国家码,想只留数字,公式
=REGEXREPLACE(C2, "[^0-9]", "")。这里的 ^ 在方括号内意思反转,表示”任何非数字字符”,全部替换为空。 - 姓名”姓, 名”倒存时,用
=REGEXREPLACE(B2, "(.+),\s+(.+)", "$2 $1")交换前后两段。注意 Excel 用 $1、$2 引用捕获组(不是多数教程里的 \1、\2),且逗号后要用\s+而非单个空格,否则双空格会留下看不见的前导空格。
四、三函数协同与注意事项
- REGEXTEST 支持整片区域,结果自动向下溢出;套一层 FILTER 可只捞出校验失败的行:
=FILTER(A2:A13, NOT(REGEXTEST(A2:A13, "^[A-Z]{3}-[0-9]{4}$")))。 - 正则默认贪婪,填充整列前先在五行上试。可读性较差,复杂规则旁边留一行注释;用买断版(perpetual)打开会显示 #NAME?。
- 每月结构固定的导入,用 Power Query 更合适(刷新即重跑);正则适合”太杂以致 Flash Fill 搞不定、太小不值得建查询”的中间地带。
来源:MakeUseOf







