②WPS新增的REGEXP函数,有何特别魔力让人如此推荐?

龙逸凡
龙逸凡

创作者俱乐部成员

【这是REGEXP函数的第二篇,还有第三篇】

昨天我们介绍了正则表达式的基础知识、REGEXP函数的提取和拆分的基础入法。

接昨天的文章:

今天我们继续:

按多个指定字符拆分

公式:

=REGEXP(A2,"[^*/-]+")

正则表达式解释:

^:在字符集中,它表示“非”或“排除”的意思,即不匹配括号内列出的字符。

[^*/-]+ 这个正则表达式匹配任何不是星号(*)、斜杠(/)或连字符(-)的字符,并且这个模式会匹配一个或多个这样的字符(因为 + 表示匹配一次或多次)。

取指定第几节

在上面的公式外套一个INDEX函数,取指定的第几节

公式:

=INDEX(REGEXP(A2,"[^*/-]+"),3)

提取多个指定字符前后的内容

提取“镇、乡、街道”之前(含)的内容

公式:

=REGEXP(A2,"(.+)[镇乡街道]")

正则表达式解释:

(.+):这是一个捕获组,用圆括号 () 表示。. 表示匹配任意单一字符(除了换行符),而 + 表示匹配前面的元素一次或多次。因此,(.+) 会匹配一个或多个任意字符,并将这些字符作为一个捕获组。

[镇乡街道]:这是一个字符集,用方括号 [] 表示。它会匹配方括号内的任意一个字符。在这里,它会匹配“镇”、“乡”、“街”或“道”这四个字符中的任意一个。

提取“镇、乡、街道”之后(不含)的内容

公式:

=REGEXP(A2,"([^镇乡(街道)]+)$")

正则表达式解释:

$:表示字符串的结尾。

提取最后一个指定字符之前的内容(不含)

公式:

=REGEXP(A2,"^.*(?=\\)")

正则表达式解释:

  • ^: 表示匹配输入字符串的开始位置。

  • .*: 表示匹配任意字符(除换行符外)零次或更多次。

  • (?=\\): 这是一个零宽度正预测先行断言,表示匹配后面紧跟着一个反斜杠 \ 的位置。(两个反斜杠表示反斜杠本身。第一个反斜杠是转义符)

使用REGEXP函数进行替换

公式

=REGEXP(A2,"(偷懒1)|(toulan3)|(偷lan2)",2," ")

“|”是或的意思,三个分组之间用 | 分隔,表示逻辑“或”。这意味着只要单元格 A2 的内容匹配这三个子模式中的任意一个,正则表达式就会返回匹配成功。

REGEXP的第三参数为2表示进行替换。第三参数为替换后的内容。

使用REGEXP函数进行插入

公式:

=REGEXP(A2,"([一-龟]+)(\d{2})(.+)$",2,"\1\2偷懒\3")

解释:

"([一-龟]+)(\d{2})(.+)$"

([一-龟]+):这是一个捕获组,匹配一个或多个从“一”到“龟”的中文字符。在Unicode中,“一”到“龟”是一个连续的字符范围,因此这个表达式可以匹配这个范围内的任意中文字符。

(\d{2}):这是第二个捕获组,匹配恰好两个数字字符。

(.+):这是第三个捕获组,匹配一个或多个任意字符(除了换行符)。

$:表示字符串的结尾。

"\1\2偷懒\3"

\1:引用第一个捕获组匹配的内容。

\2:引用第二个捕获组匹配的内容。

偷懒:这是一个固定的文本字符串,将被插入到替换结果中。

\3:引用第三个捕获组匹配的内容。

另外,再来看群友分享的一个插入案例,一个很牛的正则表达式,值得好好揣摩:

在二个字的姓名中插入空格

公式:

=REGEXP(A2,"(?<=^|\+)([一-龟])([一-龟])(?=\+|/|$)",2,"\1 \2")

解释:

"(?<=^|\+)([一-龟])([一-龟])(?=\+|/|$)"

(?<=^|\+):这是一个后视断言(lookbehind assertion),它表示匹配必须紧跟在字符串的开头 ^ 或者加号 + 之后。

([一-龟]):这是一个捕获组,匹配从“一”到“龟”这个范围内的任意一个中文字符。

(?=\+|/|$):这是一个前瞻断言(lookahead assertion),它表示匹配必须后面紧跟一个加号 +、斜杠 / 或者字符串的结尾 $

替换模式

"\1 \2"

\1:引用第一个捕获组匹配的内容。

:插入一个空格。

\2:引用第二个捕获组匹配的内容。

去掉带汉字的括号内的内容、中括号内的所有内容

这是RPA偷懒群群友的问题,去掉带汉字的括号内的内容、中括号内的所有内容

公式:

=REGEXP(A2,"([(\(][^()]*[一-龟]+[^()]*[\))])|(【.*?】)",2,"")

解释:

第一个捕获组:[(\(][^()]*[一-龟]+[^()]*[\))])

  1. [(\(]:匹配一个左括号,可以是中文的左括号 或英文的左括号 (

  1. [^()]*:匹配零个或多个不是左括号 ( 或右括号 ) 的字符。

  1. [一-龟]+:匹配一个或多个从“一”到“龟”的中文字符。

  1. [^()]*:再次匹配零个或多个不是左括号 ( 或右括号 ) 的字符。

  1. [\))]:匹配一个右括号,可以是中文的右括号 或英文的右括号 )

这个捕获组主要用于查找被括号包围的字符串,其中至少包含一个从“一”到“龟”的中文字符。

第二个捕获组:【.*?】

  1. :匹配中文的左方括号。

  1. .*?:非贪婪模式匹配零个或多个任意字符(除了换行符)。

  1. :匹配中文的右方括号。

这个捕获组用于查找被中文方括号包围的任意字符串。

替换模式:""

在这个例子中,替换模式是一个空字符串 "",这意味着如果找到匹配项,它将被替换为一个空字符串,即删除匹配到的内容。

如果要求和,还要使用substituts函数替换将中括号、大括号替换为小括号,然后再用EVALUATE函数求和(Excel只能在定义名称中使用)

完整公式

=EVALUATE(SUBSTITUTES(REGEXP(A2,"([(\(][^()]*[一-龟]+[^()]*[\))])|(【.*?】)",2,""),{"{","[","(","}","]",")"},{"(","(","(",")",")",")"}))

提取整理个人信息

个人信息姓名在最前面,其他信息顺序不一致,且分隔符不一致。要用公式提取比较麻烦,用正则表达式来提取却得心应手。

数据:

张三、手机号:13912345678 车牌 京AF12345 生日:1990年5月15日 出生地:北京市海淀区

欧阳峰,籍贯:上海市徐汇区 车号:沪B6789Q 手机号:13698765432 出生:1985-10-20

慕容吹雪 粤CD54321 广东省深圳市 1988年3月25日 13787654321

赵六、手机:13565432109 江苏省南京市 出生:1995-7-18 车牌号:苏D0987X

刘牛 四川省成都市 1983-12-18 手机13876543210 车牌 川F23456

公式:

  • 提取姓名:

=REGEXP(A2,"(^[一-龟]+)")

  • 提取手机号:

=REGEXP(A2,"([0-9]{11})")

  • 提取籍贯(五个汉字以上):

=REGEXP(A2,"([一-龟]{5,})")

  • 提取出生日期:

=--REGEXP(A2,"(\d{4}年\d{1,2}月\d{1,2}日|\d{4}-\d{1,2}-\d{1,2})")

  • 提取车牌号:

=REGEXP(A2,"(?<=[^一-龟\w])([一-龟]\w+)")

提取手机号、籍贯、车牌号等这些都不是很精确的写法。

后面还有第三篇,有更多新颖的用法

本文收录于合集WPS技巧、函数讲解及经典公式

重庆
浏览 4394
14
13
分享
13 +1
6
14 +1
全部评论 6
 
zha7090
zha7090

创作者俱乐部成员

收藏,学习了。谢谢
· 广东省
回复
 
云淡风轻
请问龙老师,第七个例子,为什么我在练习时,中文的()不能被识别?另外,我用英文的[]替代公式中中文的【】,为什么也不可以?谢谢了
· 广东省
回复
长嘶马
中文的括号前面就不需要反斜杠了
· 湖南省
回复
 
亂雲飛渡
学习
· 广东省
回复
 
WPS_1697518396
遇到一个奇葩的问题,字符串里有个“全角的空格“,其他语言里可以用"\u3000"去匹配,但这个公式里不可以,问问大哥怎么处理。
· 浙江省
回复
龙逸凡
龙逸凡

创作者俱乐部成员

直接复制全角空格到REGEXP中。=REGEXP(A1," ")。验证公式=DEC2HEX(UNICODE(REGEXP(A1," "))),计算结果就是十六进制的3000。这个公式可计算提取出的全角空格的unicode编码12288,然后转换为十六进制的3000。
· 重庆
回复