REGEXP函数详细使用攻略

阿武
阿武

WPS函数专家

WPS借由REGEXP函数率先将正则表达式引入至表格函数体系中,从此正则开始步入办公领域,REGEXP函数从诞生之日起,它的意义与使命就注定不凡。借助于强大的正则引擎,REGEXP函数毋庸置疑地成为一把处理字符串的神兵利器,这对于经常与文本斗智斗勇的表哥表姐来说,无疑是一件喜大普奔之幸事。也许,微软也意识到了正则表达式在字符串处理中的重要意义,在WPS推出REGEXP函数之后,Microsoft 365 Beta版也紧跟引入了三个正则函数。

正则表达式有着一套较为完备的体系,甚至可以把它当作一门弱化了的编程语言,它足够规范、足够灵活、也足够强大,但伴随而来的就是,正则表达式的相关知识较为抽象繁杂,有着一定的学习门槛。而REGEXP函数则像是一把打开通往正则世界大门的钥匙,我们想要通过它驾驭强大的正则引擎,首先就必须掌握它的基本函数语法以及相关的使用技巧。

因此,本文不涉及太多正则表达式相关基础知识的介绍,想较为系统、深入地学习正则表达式,可以移步至我B站正则表达式专题教程:正则表达基础。本文则聚焦于函数的基本语法和使用技巧,由浅入深地带领你掌握REGEXP函数。目前,REGEXP函数还在不断优化之中,后续可能会有新特性的添加或用法的变更,均以实际发布的为准,本文介绍时所用的正式版本号是17827。

函数语法

📢

REGEXP (原始字符串, 正则表达式, 匹配模式, 替换内容)

第一参数:原始字符串,是必选参数,指我们需要处理的字符串。从数据类型上来说,它可以是文本、数字,但不可以是逻辑值(亦称布尔值,包括TRUE或FALSE),更不可以是错误值。

第二参数:正则表达式,是必选参数,指符合正则表达式语法规范的字符串。在一般的情况下,我们用英文的状态下的双引号""将正则表达式的文本包裹起来,这样WPS才能够将其识别为文本。但在某些特殊情况下,如需精确匹配数字45,我们直接可以填入45,而不必填入"45"。虽然软件支持这种写法,但我们依然强烈建议均写成双引号""包裹的形式!

第三参数:匹配模式,是可选参数,该参数取值分为4种情况:

0-提取:返回正则表达式(第二参数)在原始字符串(第一参数)中匹配到的所有结果,默认启用正则引擎的全局模式。若正则表达式在需要处理的字符串中无法匹配到任何的结果,则返回#N/A错误。若第三参数省略不写,则默认此提取模式。

1-判断:返回正则表达式(第二参数)是否能在原始字符串(第一参数)中匹配到。如果能,则返回TRUE,如果不能,则返回FALSE。

2-替换:将正则表达式(第二参数)在原始字符串(第一参数)中匹配到的字符串替换为第四参数中的字符串。也就说,只有第三参数启用且值为2(切换至替换模式)的情况下,第四参数才可以启用,否则函数将返回#VALUE!错误!在替换模式下,如果正则表达式匹配不到结果,函数不报错,而是返回原始字符串。

3-完整提取:当前面两个参数其中一个为数组形式且对于数组中的每一个字符均可匹配到多个结果时,启用该值为3的时候,表面上看似只返回匹配结果中的第一个值,但实际上,里面所有数值都存在!我们可以通过REDUCE将隐藏在里面的数值给显示出来。由于这部分的内容涉及了函数的数组用法,将在后文中进一步详细介绍。

第四参数:替换内容,是可选参数。当第三参数取值为2,切换为替换模式时,该参数才可以启用,表示要替换成的字符串。如果该参数省略不写,则默认替换为空值。

注意:REGEXP函数最终返回的结果是文本,如果提取的是文本型的数字,则需要通过--或其他不改变其值的四则运算将其转为真数字。

数组用法

第一参数支持数组:

第二参数也支持数组:

如果两个参数同时启用数组呢?这个时候的情况就会比较有趣。比如说:第一参数启用纵向数组,第二参启用横向数组:

这时候,由于遵循数组运算的规则,保留行列上最大的数组尺寸,它是可以顺利拿到最终结果的。接着,我们再来看一个更加复杂的情况。

比如说,我有这样一列数据,对于列中的每一行,我想提取出所有的数字,如果是逐行写公式,很简单,我们这样写就可以:

此时,如果我们将REGEXP函数第一参数改为数组呢?先来看下会发生什么情况?

对比上一个结果,我们可以发现:当第一参为数组时,如果数组中的每一个字符串可以匹配到多个结果,比如说:阿武666醉清风888,\d+可以匹配到:666和888。由于第三参被省略,在默认启用的参数值为0的情况下,只提取匹配结果的第一个值(666)。那如何同时提取到多个值呢?上面介绍参数的时候,其实已经提到了,就是第三参取值为3,那它就可以保留所有的匹配结果。我们先来看下最直观的结果:

这个结果表面上看起来,和第三参数取值为0(省略该参数时的默认值)没有任何不同!实际上,它们是不一样的,666里面其实还藏着888,我们可以通过REDUCE函数把隐藏在里面的数据真身给展示出来:

需要注意的是,这里的#N/A错误并不是原数组中的内容,而是VSTACK在堆叠数组时,由数组尺寸的不一致所导致的!对于第三参数为0的情况,我们来检查一下里面是否也存在数据:

很显然,它是不存在的!

我们接着来看另外一个情况,第二参数为数组时,第三参数取值3的结果表面上看起来和第三参数取值为0的结果一模一样:

我们再次借助REDUCE查看,则可以发现明显的不同:

最后,我们大胆来设想一下,还是上面的数据,如果第一参数和第二参数同时启用数组形式,它还可以返回正确的结果吗?我们来测试一下:

哇,居然也可以!这个就很逆天了!需要注意的是,这个的#N/A是因为匹配不到汉字导致的,这时可以用MAP函数将其聚合为文本显示出来:

最后,我们可以得到这样的结论:当第一或第二参数至少一个启用数组时,对于数组的每一个字符串,如果正则表达式均可返回多个匹配结果,则:第三参数取值为0时,函数返回所有结果的首值;第三参数取值为3时,函数则保留所有返回结果,但表面上的结果和取首值是一样的。

讲了这么多,可能你心里会疑惑,它究竟能用在什么地方?案例立马就奉上!

经典案例

比如说,我们有这样的数据:

我想把每名员工的消费情况整理成如下格式的表格:

这里先铺垫一个基础知识:在正则表达式中,元字符\K可以重置当前文本位置。比如说,我们有这样的文本:支付宝3035:支付宝965:微信6799,我想把支付宝后面紧挨着的数字给提取出来,我们可以用断言这样写:

这时候,我们也可以用\K重置文本位置的方法简写:

在这个基础之上,我们再来理解这个表达式就很容易啦:

这里的REGEXP函数的第一、二参数同时启用了数组形式,而且第三参数取值为3,所以图中的3035实际上包含了3035和965,我们可以用--来快速检测这个结果:

图中箭头的位置,如果是单值,也就是纯文本数字3035的话,加上--不应该报错的。很显然,这里不是单值,而是包含了多个值,所以报错了。这时候,我们可以借助MAP函数把里面的多个文本型数字进行求和:

如果在Excel中想实现同等的效果,则相对麻烦,如下图所示:

以上便是我在WPS社区上第一篇分享的全部内容,如有谬误,欢迎大家批评指正,如果大家觉得有帮助,不要忘记点赞+评论+收藏哦!

广东省
浏览 1653
17
33
分享
33 +1
29
17 +1
全部评论 29
 
zha7090
zha7090

创作者俱乐部成员

第三参数取值为3的时候,结果单元格内可能是隐藏了数据。那么WPS能不能把这种带有隐藏数据的单元格用特别的形式表示出来?谢谢
· 广东省
回复
 
徐永冬
武哥真厉害,这题原来是你出的
· 广东省
回复
阿武
阿武

WPS函数专家

不是我出的呀,我只是用了他们的题目作为举例。
· 广东省
回复
 
LG
11
· 河南省
1
回复
 
WPS_1539099753
收藏学习。。
· 四川省
1
回复
 
Hao123
感谢分享,学习啦……
· 内蒙古
1
回复
 
fang
收藏学习
· 浙江省
1
回复
 
zha7090
zha7090

创作者俱乐部成员

收藏学习……
· 广东省
1
回复
 
亂雲飛渡
收藏学习
· 广东省
1
回复
 
HC.旋
· 福建省
1
回复
 
心梦缘
受益匪浅啊武哥
· 浙江省
回复
阿武
阿武

WPS函数专家

是吧,还是多少有些新东西讲了出来。
· 广东省
回复
 
一沙一世界
👍🏻👍🏻👍🏻👍🏻👍🏻
· 广西
1
回复
 
清华学弟任泽岩
清华学弟任泽岩

创作者俱乐部成员

阿武老师来社区是降维打击了~
· 辽宁省
回复
阿武
阿武

WPS函数专家

哪里呀,相互学习
· 广东省
回复
 
阿煮
学习了😊
· 江苏省
1
回复
 
小蚂蚁
· 广东省
回复
阿武
阿武

WPS函数专家

· 广东省
回复
 
凤凰涅槃
超级点赞~ 写的太详细了, 清晰易懂, 有图有真相
· 湖南省
回复
阿武
阿武

WPS函数专家

哈哈,这个截图确实截了好久。
· 广东省
回复
 
好运连连
啊啊
· 山东省
1
回复
 
wps新路
wps新路

WPS函数专家

点赞学习,武佬一如既往的强
· 重庆
回复
阿武
阿武

WPS函数专家

感谢大佬支持
· 广东省
回复
 
醉清风
醉清风

WPS函数专家

武佬出品,必属精品
· 安徽省
回复
阿武
阿武

WPS函数专家

感谢醉佬捧场
· 广东省
回复
 
董欣煜
武哥好呀,学习了
· 吉林省
回复
阿武
阿武

WPS函数专家

第一篇写了好久
· 广东省
回复