打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
③WPS新增的REGEXP函数,刚琢磨出的新颖用法


  • 这个函数好用,很好用,非常好用,真的很好用,好用到龙逸凡写了二篇文章还不过瘾,还要写第三篇

    今天这篇我们来扩展一下,来看看它的另类用法。

第二参数为数组时会怎样?

将REGEXP函数的第二参数用常量数组看看会怎样:

=REGEXP(A1,{"[^一-龟]+","[一-龟]+"})

如果不理解什么是常量数组,请看这篇文章扫盲:

在第一篇文章中介绍过,

用=REGEXP(A1,"[^一-龟]+"})提取英文,

用=REGEXP(A1,{"[一-龟]+"})提取汉字。

详见下面链接的第4部分:

但当第二参数使用常量数组时,它只给出了每种情况的第一个值。

所以,可利用这个特点,来限定只提取第一个值:

=REGEXP(A1,{"[一-龟]+"})

我们继续深入。

如果第二参数是单元格区域会怎么样呢?

包含式反向查找(根据全称查简称)

工作中有时候需要根据长的文本来查短的。比如下图中凭证摘要中含有各品牌的车型。现在需要将车型提取出来。

以前我们是LOOKUP来提取,公式:

=IFNA(LOOKUP(9^9,FIND($C$3:$C$12,$F3),C$3:C$12),"")

这公式比较复杂,我们用REGEXP函数来提取试试,第二参数填入多个车型列表:

=REGEXP(F3,$C$3:$C$12,0)

可以看到,只有一个正确的结果,其他为#N/A

我们用TOCOL来过滤掉错误值,只留下正确的值:

=TOCOL(REGEXP(F3,$C$3:$C$12,0),2)

继续扩展,将摘要中购买的多个蔬菜和肉类名称提取出来合并:

=TEXTJOIN("、",1,TOCOL(REGEXP(B2,$F$2:$F$10),2))

根据不连续简称查全称

我们平时使用的很多简称,都是不连续的,比如“重庆大学”简称为“重大”,无法利用VLOOKUP的通配模式来查找。

这种情况的查找,其经典公式是这样的:

=INDEX($A$2:$A$9,MATCH(0,MMULT(-ISERR(FIND(MID(D2,COLUMN(A:Z),1),$A$2:$A$9)),$B$1:$B$26+1),))

公式很长、很复杂,如果用REGEXP函数就要简化一点,

公式:

=TOCOL(MAP($A$2:$A$9,LAMBDA(x,REGEXP(x,".*"&REGEXP(D2,"(.)",2,"\1.*")))),2)

解释:

要理解这公式首先要理解用REGEXP提取每一个字符(拆分):

然后再用REGEXP的替换模式来插入。

具体用法见里面的REGEXP函数:

=REGEXP(D2,"(.)",2,"\1.*")

它是在每一个字之间插入“.*”,详细解释:

  1. 正则表达式"(.)"

    • 这是一个捕获组,它匹配任何单个字符(. 表示任何字符,但只匹配一次)。捕获组 (...) 用于记住匹配的字符,以便稍后在替换字符串中使用。

  2. 第三参数为2,为替换模式

  3. 替换模式"\1.*"

    • \1:这是一个反向引用,它引用了第一个捕获组(在这种情况下,就是前面提到的单个字符)中匹配的文本。

      "\1.*" 在第一个捕获组后面插入“.*”

再在这个REGEXP函数的计算结果的前面,添加一个".*",将拼接结果做为最外围的REGEXP函数的第二参数的正则表达式。

由于REGEXP函数的第一参数不支持数组。所以得用MAP+LAMBDA函数,将A2:A9单元格区域的单元格,逐个传递给REGEXP的第一参数。

然后用TOCOL过滤掉计算结果中的错误值。

给银行卡每四位添加一空格

从后往前每4位添加一空格的公式:

=REGEXP(A45,"(?=(?:\d{4})+$)",2," ")

正则表达式解释:

  1. (?=...):这是一个正向先行断言的语法。它告诉正则表达式引擎,我们需要匹配一个位置,该位置后面紧跟着括号内的模式,但光标(即匹配位置)不会移动到括号内的模式之后。

  2. (?:...):这是一个非捕获组。它用于对表达式进行分组,但不捕获匹配的文本,即匹配结果中不会包含这部分匹配的文本。

  3. \d{4}:匹配四位数字。\d 表示数字字符,{4} 表示恰好四次。

  4. +:表示匹配前面的元素(在这个情况下是四位数字)一次或多次。

  5. $:表示字符串的结尾。

从前往后每4位添加一空格的公式

=REGEXP(A45,"(\d{4})(?=\d)",2,"\1 ")


正则表达式解释:

  1. (\d{4}):这是一个捕获组。

    • \d 表示任意一个数字字符,等同于 [0-9]

    • {4} 表示前面的元素(在这里是数字字符 \d)重复四次。因此,\d{4} 匹配任意一个四位数。

  2. (?=\d):这是一个正向先行断言。

    • ?= 是正向先行断言的语法,它指定了一种条件,即在不消耗任何字符的情况下,检查其后面的字符是否符合指定的模式。

    • \d 再次表示任意一个数字字符。

给字符串中的数字添加千位分隔符

如果是数值,我们可以用TEXT函数来格式化,添加千位分隔符

公式:

=TEXT(B6,"#,##0.00元")

如果是文本中的数字,就不能使用TEXT函数了,可以用REGEXP函数来添加千位分隔符,公式:

=REGEXP(B2,"(?<=\d)(?=(?:\d{3})+($|[^\d年]))",2,",")

正则表达式解释:

  1. (?<=\d):这是一个后向断言,它用于匹配一个位置,该位置前面有一个数字(\d),但这个数字不会被包括在匹配结果中。

  2. (?=...):这是一个正向断言,用于匹配一个位置,该位置后面跟随有括号内的模式,但这个模式不会被包括在匹配结果中。

  3. (?:\d{3})+:这是一个非捕获组,用于匹配一个或多个连续的三位数。(?:...) 表示这是一个非捕获组,而 \d{3} 表示恰好三个数字字符。

  4. ($|[^\d年]):这是一个选择结构,用于匹配字符串的结尾($)或者一个非数字且非汉字“年”的字符([^\d年])。

    • $ 表示字符串的结尾。

    • [^\d年] 是一个字符集,匹配任何不是数字(\d)和汉字“年”()的字符。

统计个数

公式:

=SUM(--REGEXP(C3,$A$3:$A$19,1))

公式解释:

REGEXP函数的第3参数为1时,是判断模式,符合条件的为true、不符合的为false。然后在REGEXP函数前添加两个负号,负负得正,将逻辑值转化为1和为,然后用SUM求和。

看了上面的内容,是不是觉得REGEXP函数很神奇。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPS表格:开挂般的功能升级,你准备好了吗?
8个Excel新函数,每一个都很强大!WPS赶快跟进呀~
Office365中的这几个高能函数,正中使用痛点,用起来真香!
微软一口气测试14个新函数,Excel函数加速向编程语言进化~
一维表和二维表互转,这个方法只有1%的人知道!
NO.187# MAKEARRAY函数小课堂
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服