一招制胜|门店ID想拆就拆?WPS表格 REGEXP 正则函数一行搞定——贪心匹配四式实战

Lv.3 优质创作者
刚上班,小白就通过OA传过来一张“门店数据.XLSX”电子表格。
没等我张口,旁边的小白又跑了过来。
| 💡 | 电脑数字小键盘右上角的“-”有两个名字(标准名称 ): 减号 (对应其运算功能)或 负号 (对应其符号功能),可别叫错了。 |
我笑了笑:这就到"正则"的地盘了,WPS 表格里一个 REGEXP 函数,轻松把这两种拆法全包了。今天顺便给你讲讲它背后那个"贪心"的脾气。
一、REGEXP 正则函数是个啥
一句话:REGEXP 就是用"一套规则"去表格里找文本、判断文本、替换文本的函数——规则叫正则表达式。语法很简单,就 4 个参数:REGEXP(原始字符串, 正则表达式, [匹配模式], [替换内容]),不像 Excel 那样分成 REGEXEXTRACT / REGEXMATCH / REGEXREPLACE 三个函数。
原始字符串:要处理的文本(可以引用单元格)
正则表达式:那套"匹配规则",比如 .*、[0-9]、(?<=-) 这些
匹配模式:告诉它要干嘛,见下表
替换内容:只有"替换模式"才用得上
匹配模式 | 干什么 | 返回结果 |
0(默认) | 提取 | 把符合规则的文本拎出来 |
1 | 判断 | 有没有匹配到,返回 TRUE/FALSE |
2 | 替换 | 把匹配到的换成指定内容 |
3 | 完整提取 | 类似提取,但配合数组可取出全部结果 |
二、先看传统写法,是多"费劲"
先别急着上新函数,咱把原始列数据摆出来看看。表格中“门店ID ”这一列记录信息是:地区-年份+序号-分类后缀,两个负号把一列切成三段,我们要按第一个负号来切。
1.提取地区信息的函数公式:=LEFT(A2,FIND("-",A2)-1)
2.提取年份信息的函数公式:=MID(A2,FIND("-",A2)+1,4)
看出问题没?两个公式,全靠 FIND("-",A2) 数负号位置,再加减 1 调边界,再分别使用LEFT和MID 截文本字符。思路绕、嵌套深,改一个地方就要跟着改一串,这就是小白的"头大"来源。
三、REGEXP 四式实战——重点看看"贪心不贪心"
正则表达式里有个 .*,意思是"想匹配多少字符就匹配多少,多多益善"。它天生有个臭脾气:贪心——上来就一口气吃到字符串的结尾,吃完了发现不对,才肯往回"吐"一点。
光说概念容易晕,咱直接拿今天的主角 WZ-202021-AA 当"食材",把 4 个式子一次喂明白。先记牢目标:地区要拆出 WZ,成立年份要拆出 2020。
① 拆"地区",不保留负号 → WZ
我们要的是"第一个负号前"的字符。公式这样写:
=REGEXP(A2,"^[^-]*",0)
白话解读:"正则表达式"里第一个“^"意思是从A2单元格开头提取,[^-]中的“^”意思是“不是”或“非”的意思,[^-]代表只要不是负号号的字符,来一个收一个(*),一碰见负号立刻收手。“匹配模式”中,输入“0”或省略代表提取。
于是它从 W 收到 Z,正要去吃那个负号——刹住。拿到 WZ,干净利落。
② 拆"地区",保留负号 → WZ-
小白说:“那我想把负号也保留下来,一起拆出来,该怎么写?”
我说:“这次负号也要一起要。公式这样写:
=REGEXP(A2,"^[^-]*-",0)
白话解读:这里的思路和①一模一样:还是先收一堆"不是负号"的字符([^-]*),然后末尾补一个负号 -,把负号也留下,就成了 WZ-。和①相比,就差最后这个"-"。
"还有一种写法:“我说。
公式这样写:=REGEXP(A2,"^.*?-",0)
^.*?- 和 ^[^-]*- 都能拿到 WZ-,但逻辑相反——前者是"贪心吃到最后再回退到第一个",后者是"天生只吃非负号、遇负号即停",后者更直观、也更稳。
小白若有所思地点点头:“明白了,正则这东西,想达到同一个目的,路子还真不止一条。”
我拍了拍他肩膀:“对头,这就是正则的妙处——条条大路通罗马,但每条路上的坑不一样,把原理吃透就不会掉进去。”
③ 拆"成立年份",不保留减号 → 2020
年份就是门店ID里紧挨着的 4 位数字。函数公式编写要实用省心,不管贪心不贪心,直接这样写:
=REGEXP(A2,"[0-9]{4}",0)
白话解读:不用管负号在哪,直接在门店ID里找紧挨着的 4 个数字,取出来就是年份。
于是它一眼相中 2020,稳稳取出。就这么简单,完全不牵扯什么贪心。
④ 拆"成立年份",保留负号 → -2020
小白说:“ 拆‘成立年份’那我还想把负号也保留下来,一起拆出来,该怎么写?”
公式这样写:
=REGEXP(A2,"-[0-9]{4}",0)
白话解读:把负号连同后面紧挨的 4 个数字一起取出来,就是 -2020。
正则表达式四式一表看全
场景 | 门店ID WZ-202021-AA | REGEXP 一行搞定 | 白话口诀 |
① 地区·不保留负号 | WZ | =REGEXP(A2,"^[^-]*",0) | 不是负号就收,遇减号即停 |
② 地区·保留负号 | WZ- | =REGEXP(A2,"^[^-]*-",0) | 非负号收一堆,末尾补个 - |
③ 年份·不保留负号 | 2020 | =REGEXP(A2,"[0-9]{4}",0) | 直接取4位数字,简洁省心 |
④ 年份·保留负号 | -2020 | =REGEXP(A2,"-[0-9]{4}",0) | 减号连着取4位数字 |
四行公式,每一行都能"读出人话",一眼看明白在干嘛。以后换了别的分隔符(逗号、斜杠、下划线),把 - 一换,照样通用。
四、记个三步口诀
适用:任何"按某个分隔符拆字段"的活——门店ID、订单号、版本号、文件路径,通吃。
提醒:正则高手都栽过 .* 的跟头。凡是 .* 后面还跟着别的字符(比如 .*-),一定要想清楚它是贪心吃到最后,还是你想要的第一个。
小白盯着四行公式,眼睛发亮,又问了一句:"哥,那我要拆第三个负号后面的呢?"
我摆摆手:"那就是进阶版了,先把今天这四式消化透,回头我教你 .+、捕获组和 $,你就能随便拆了。去吧,拆完请我喝奶茶。"
Lv.1 新人创作者
Lv.3 优质创作者
Lv.3 优质创作者