Excel 三个正则函数,专治表格文本清洗

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

一位 MakeUseOf 撰稿人分享,他用 REGEXTEST、REGEXEXTRACT、REGEXREPLACE 三个新函数,把写了多年的复杂清洗公式退役了。这三个函数只在 Excel for Microsoft 365 和 Excel 网页版里提供,Excel 2021、2024 等买断版并没有,动手前先确认自己的版本。

一、REGEXTEST:一行公式校验整列

  1. 在单元格输入 =REGEXTEST(文本, 正则, [是否区分大小写])。”文本”填要检查的单元格或区域;”正则”用一段简写描述”合法长相”;第三个参数默认 0 表示区分大小写,填 1 则不区分。
  2. 例如订单号规则是”三位大写字母+连字符+四位数字”,公式写为 =REGEXTEST(A2, "^[A-Z]{3}-[0-9]{4}$")。^ 和 $ 把匹配钉在字符串首尾,[A-Z]{3} 表示三个大写字母,[0-9]{4} 表示四位数字。
  3. 过去校验同样的订单号,要套四层 LEN、MID、ISNUMBER、EXACT 嵌套;一旦供应商前缀变成五位字母,后面每层判断都会跟着错。改用正则后,描述的是形状而非数位置,前缀长度变化也不影响。

二、REGEXEXTRACT:不数字符也能取值

  1. 函数写法 =REGEXEXTRACT(文本, 正则, [返回模式], [是否区分大小写])。返回模式填 0 取首个匹配、1 取全部、2 取首个匹配里的捕获组。
  2. 产品编码形如 ELEC-NORTH-4471-A,中间四位数字是订单号,但前缀有时四个字有时六个字,永远不在同一位置。公式 =REGEXEXTRACT(D2, "[0-9]{4}") 即可,不用锚点,让 Excel 扫描出第一组连续四位数字。
  3. 注意三个函数返回的都是文本,要拿去加总时记得用 VALUE 函数包一层转成数字。

三、REGEXREPLACE:多层嵌套塌成一行

  1. 写法 =REGEXREPLACE(文本, 正则, 替换值, [第几次出现], [是否区分大小写])。替换值留空引号 “” 即删除匹配内容。
  2. 电话号里混着括号、点、空格、国家码,想只留数字,公式 =REGEXREPLACE(C2, "[^0-9]", "")。这里的 ^ 在方括号内意思反转,表示”任何非数字字符”,全部替换为空。
  3. 姓名”姓, 名”倒存时,用 =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