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

临商珑胜
临商珑胜 WPS产品体验官Lv.3 优质创作者

Lv.3 优质创作者


  刚上班,小白就通过OA传过来一张“门店数据.XLSX”电子表格。

没等我张口,旁边的小白又跑了过来。

  小白:哥,领导让我把这个表里的"门店ID"这一列数据进行拆分,要求把第一个负号前的字符填写到"地区"列,然后把它后面的4位数字填写到"成立年份"列,可我只会一手动复制粘贴,这几百行要拆到猴年马月去?愁死我了!
💡

 电脑数字小键盘右上角的“-”有两个名字(标准名称 ): 减号 (对应其运算功能)或 负号 (对应其符号功能),可别叫错了。

  我笑了笑:这就到"正则"的地盘了,WPS 表格里一个 REGEXP 函数,轻松把这两种拆法全包了。今天顺便给你讲讲它背后那个"贪心"的脾气。


一、REGEXP 正则函数是个啥

  一句话:REGEXP 就是用"一套规则"去表格里找文本、判断文本、替换文本的函数——规则叫正则表达式。语法很简单,就 4 个参数:REGEXP(原始字符串, 正则表达式, [匹配模式], [替换内容]),不像 Excel 那样分成 REGEXEXTRACT / REGEXMATCH / REGEXREPLACE 三个函数。

  1. 原始字符串:要处理的文本(可以引用单元格)

  1. 正则表达式:那套"匹配规则",比如 .*、[0-9]、(?<=-) 这些

  1. 匹配模式:告诉它要干嘛,见下表

  1. 替换内容:只有"替换模式"才用得上

匹配模式

干什么

返回结果

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位数字

  四行公式,每一行都能"读出人话",一眼看明白在干嘛。以后换了别的分隔符(逗号、斜杠、下划线),把 - 一换,照样通用。


四、记个三步口诀

前不留就用 [^-]*,前留负号末尾补个 -;后不留直接取 [0-9]{4},后留负号连着取 -[0-9]{4}。
  • 适用:任何"按某个分隔符拆字段"的活——门店ID、订单号、版本号、文件路径,通吃。

  • 提醒:正则高手都栽过 .* 的跟头。凡是 .* 后面还跟着别的字符(比如 .*-),一定要想清楚它是贪心吃到最后,还是你想要的第一个。

  小白盯着四行公式,眼睛发亮,又问了一句:"哥,那我要拆第三个负号后面的呢?"

  我摆摆手:"那就是进阶版了,先把今天这四式消化透,回头我教你 .+、捕获组和 $,你就能随便拆了。去吧,拆完请我喝奶茶。"


临商珑胜WPS知识库
@孙胜龙
山东省
浏览 279
收藏
12
分享
12 +1
5
+1
全部评论 5
 
亂雲飛渡
点赞学习
   广东省
举报
0
0
 
拾光漫行
凑两个
   重庆
举报
1
0
 
帅羊帅
帅羊帅 Lv.1 新人创作者

Lv.1 新人创作者

点赞点赞
举报
0
0
 
HC.旋
HC.旋 WPS资深用户Lv.3 优质创作者WPS寻令官KVP

Lv.3 优质创作者

点赞学习点赞学习
   福建省
举报
0
0
 
熠林
熠林 Lv.3 优质创作者

Lv.3 优质创作者

点赞学习
   浙江省
举报
0
0