智能助手
帮助中心智能助手上线
我能为你解答 Lark 使用的问题,快来问问我吧!
00:00
点击按住可拖动视频
我知道了
去试试

REGEX 系列函数

本文阅读时长:7 分钟
一、函数介绍
REGEX 函数是指支持正则表达式的系列函数包含 REGEXMATCHREGEXEXTRACT 以及 REGEXREPLACE 函数,让你可以方便地在海量文本中批量查找提取替换你想要的模式化内容。
二、函数解读
REGEXMATCH
  • 公式功能:判断文本是否包含正则表达式所描述的内容,判断结果显示为布尔值 TRUE 或 FALSE
  • 函数公式: = REGEXMATCH(文本, 正则表达式)
  • 参数释义
  • 文本(必填)用于匹配正则表达式的文本内容
  • 正则表达式(必填) :用于检验文本的正则表达式
  • 举个例子: = REGEXMATCH("Sheets", "S.e") 将返回结果 TRUE
REGEXEXTRACT
  • 公式功能:提取文本中符合正则表达式的内容
  • 函数公式: = REGEXEXTRACT(文本, 正则表达式)
  • 参数释义
  • 文本(必填):用于匹配正则表达式的文本
  • 正则表达式(必填) :需要被提取内容的正则表达式
  • 举个例子: =REGEXEXTRACT("abcedfg", "c.*f") 用于提取 abcedfg c-f(含c、f)之间的所有文本将返回结果 cedf
REGEXREPLACE
  • 公式功能:将文本中符合正则表达式的内容替换成指定内容
  • 函数公式: REGEXREPLACE(文本, 正则表达式, 替换内容)
  • 参数释义
  • 文本(必填)用于匹配正则表达式并替换内容的文本
  • 正则表达式(必填) :需要被替换内容的正则表达式
  • 替换内容(必填):想要替换的指定内容
  • 举个例子: =REGEXREPLACE("abcedfg", "a.*d", "xyz") 将返回结果 xyzfg
三、正则表达式语法
作为该系列函数的核心,正则表达式可以用于检查字符串中是否包含符合指定规则的内容。
1.举例
假设你需要从一大堆文字材料里提取邮箱地址。你肯定知道邮箱地址的特征,但这种规则确定,文本长度和内容不确定的东西,用正则怎么去表示呢?如下:
250px|700px|reset
image.png
别被这些字符吓到,你可以在本文“元字符”部分了解其准确含义,而在上述例子中,它的意思是:
  • 第 1 部分:匹配的是邮箱前缀的特征:一串字母或数字的组合,字符长度不确定(用 + 号表示)—— 这一条规则同样也适用于邮箱后缀的前半部分,所以 @ 之后又写了一遍
  • 第 2 部分:匹配的是邮箱后缀中 example.com 里的英文句号 . 部分 —— 由于 . 在正则语法中有特殊含义,不能像前面的 @ 一样直接匹配,所以前面用转义符 \ 来表示严格匹配句号本身
  • 第 3 部分:匹配的是邮箱后缀的后半部分:两个及以上小写字母组成的内容 —— 也就是邮箱域名中常见的 example.comexample.cn 中的 com、cn 部分
注意,就像解数学题有不同的解法,对同一类型内容的正则表达式也可能不同,以上仅是邮箱正则表达式的一个参考,下面进入语法规则详解:
2.精确匹配
如果不使用特殊的元字符,你可以像平时检索任何内容一样,直接指定精确检索的内容。比如 = REGEXMATCH("Sheets", "se") 表示在 Sheets 中直接匹配 se —— 匹配不到,结果是 FALSE。
3.元字符
正则表达式更多依赖于元字符 —— 元字符并不表达它的字面意思,而是代表特殊含义。在上面例子中,如果将匹配的正则表达式修改为 S.e,也就是公式改成 = REGEXMATCH("Sheets", "S.e"),会得到 TRUE 的结果。因为 . 是一个元字符,可以用来表示任何非换行符的单个字符,所以 S.e 会匹配到 Sheets 中的 She 部分。
匹配规则:默认从左至右,如果不指定重复次数的话,会返回满足正则表达式的第一组值
分类
字符
含义
举例
字符集
[]
字符集符号,表示匹配 [] 中的任何字符
公式:=REGEXREPLACE("Room231","[0-9]","X")
将 Room231 中的数字替换为 X
结果:RoomXXX
[^]
非字符集符号,表示匹配任一不在[^]中的字符
注:^ 符号单独使用时,表示检索的起点,和这里搭配方括号的含义完全不同
公式:=REGEXREPLACE("Room231","[^0-9]","X")
将 Room231 中非数字的部分替换为 X
结果:XXXX231
重复次数
*
匹配 * 前的字符或子表达式 0 次或多次,通常用来表达任意内容
公式:=REGEXMATCH("Sheets","[0-9]*")
判断 Sheets 中是否包含 0 个及以上的数字,也就是其实有没有数字都行
结果:TRUE
+
匹配 + 前的字符或子表达式 1 次或多次
公式:=REGEXMATCH("Sheets","[0-9]+")
判断 Sheets 中是否包含 1 个及以上的数字,也就是至少要有 1 个数字
结果:FALSE
匹配 ?前的字符或子表达式 0 次或 1 次,通常用来表达一个内容可选
注:当 ? 用在 {}、* 等指定重复字数的符号后时,匹配为非贪婪模式,表示匹配符合该条件的尽可能短的内容
公式:=REGEXMATCH("Sheet","Sheets?")
这里问号让前面的 s 变得可选,所以公式的意思是:判断 Sheet 能否和 Sheets 或 Sheet 这二者之一相匹配,答案为真
结果:TRUE
{}
用于指定 {} 前字符或子表达式的重复次数:{n} 表示重复 n 次,{n,m} 表示重复 n 到 m 次,{n,} 表示重复 n 到无穷次。 n 和 m 必须为非负整数
公式:=REGEXREPLACE("Sheets","e{2}","X")
将 Sheets 中包含 两个 e 的部分替换为 X
结果:ShXts
子表达式
()
() 中的正则表达式为子表达式,会被当作一个整体来进行匹配
此外,小括号还涉及捕获概念,详见本节第 4 部分
公式:=REGEXMATCH("12344@163.com","@(163|gmail)\.com")
判断邮箱地址是否为 163 邮箱或 gmail 邮箱
结果:TRUE
或运算
匹配 |前 或 后面的内容
转义字符
\
按原样匹配 \ 后跟随的字符,主要用于匹配本身有元字符含义的符号。比如,如果需要匹配小括号,就要写做 \(,要查找英文句号,就要写 \.
公式:=REGEXREPLACE("Sheet.Best.Tool","\."," ")
将 Sheet.Best.Tool 里的 . 替换成空格,以符合正确书写规则
结果:Sheet Best Tool
定位符
^
匹配字符串的开始位置
公式:=REGEXREPLACE("abc123abc","^abc","ABC")
将 abc123abc 中开头的 abc 替换成 ABC
结果:ABC123abc
$
匹配字符串的结束位置
公式:=REGEXREPLACE("abc123abc","abc$","ABC")
将 abc123abc 中结尾的 abc 替换成 ABC
结果:abc123ABC
常用字符与字符集
.
匹配换行符(\n) 之外的任意单个字符
S.e 可以匹配 She、S2e、S@e
[a-z]
匹配 26 个小写字母的任意一个
公式:=REGEXEXTRACT("Sheets","[a-z]+")
提取 Sheets 中的所有小写字母
结果:heets
[^a-z]
匹配任何不在 26 个小写字母中的字符
公式:=REGEXMATCH("sheets","[^a-z]")
判断 sheets 中是否包含非小写字母
结果:FALSE
[A-Z]
匹配 26 个大写字母的任意一个
公式:=REGEXEXTRACT("Sheets","[A-Z]")
提取 Sheets 中的第一个大写字母
结果:S
[0-9]
匹配 0 到 9 的任意一个数字
公式:=REGEXMATCH("Sheets","[0-9]")
判断 Sheets 中是否包含数字
结果:FALSE
\w
匹配包括下划线在内的任意一个字母、数字字符,相当于[A-Za-z0-9_]
公式: =REGEXEXTRACT("email@mail","\w@\w")
提取 email@mail 中的 @ 及其前后的字母各一个
结果: l@m
\W
匹配任何一个非字母、数字的字符,相当于[^A-Za-z0-9_]
公式:=REGEXEXTRACT("email@mail","\W")
提取 email@mail 中非字母和数字的部分
结果: @
\d
匹配一个数字,相当于[0-9]
公式:=REGEXEXTRACT("email123@mail","\d")
提取 email123@mail 中的一个数字,由于默认检索为从左到右,所以匹配到 1
结果:1
\D
匹配一个非数字,相当于[^0-9]
公式:=REGEXEXTRACT("email123@mail","\D")
提取 email123@mail 中的一个非数字字符,由于默认检索为从左到右,所以匹配到 e
结果:e
\s
匹配任何空白字符,包括空格、换页符等,相当于[\f\n\r\t\v]
公式: =REGEXREPLACE("Sheet Best","\s","")
将 Sheet Best 中的空白全部删除
结果:SheetBest
\S
匹配任何非空白字符,相当于[^\f\n\r\t\v]
公式:=REGEXREPLACE("Sheet Best","\S","A")
将 Sheet Best 中的非空白部分全部替换成 A
结果:AAAAA AAAA
\b
匹配一个单词边界,即单词前后的空格,或者是句子的开头或结尾处
公式:=REGEXREPLACE("rico and coco","\bco","AA")
将 rico and coco 中,开头为 co 的单词的中的 co 替换成 AA
结果:rico and AAco
\B
匹配一个单词非边界位置
比如 er\B 可以匹配到 verb 中的 er,但匹配不到 never er
\f
匹配一个换页符
-
\t
匹配一个制表符
-
\v
匹配一个垂直制表符
-
4. 前后预查
前后预查,也叫断言、环视(look-around),用于判断字符串前后是否满足一定正则条件。它并不捕获文本,只用于辅助判断,并返回匹配条件的结果。预查的条件需要写在小括号中,目前支持以下 2 种方式:
分类
写法
含义
举例
正向肯定预查
(?=正则条件)
写法:正则表达式1(?=正则表达式2),表示在符合正则表达式2 的内容前,匹配并返回符合正则表达式1 的内容
公式:
=REGEXREPLACE("abc123abc456","abc(?=123)","ABC")
查找 abc123abc456 中后面 123 的 abc 字符,然后将之替换为 ABC
结果:ABC123abc456
正向否定预查
(?!正则条件)
写法:正则表达式1(?!正则表达式2),表示在不是正则表达式2 描述的内容前,匹配并返回符合正则表达式1 的内容
公式:=REGEXREPLACE("abc123abc456","abc(?!123)","ABC")
查找 abc123abc456 中后面不是 123 的 abc 字符,然后将之替换为 ABC
结果:abc123ABC456
5.分组与捕获 (小括号的用法)
用小括号括起来部分就是一个分组。分组又包含捕获组和非捕获组,这是什么意思呢?
  • 捕获组(Capturing Groups)该组用于匹配并获取括号中的结果
  • 非捕获组(Non-capturing Groups)该组仅用于匹配但不获取其结果,也无法用于后续的二次计算
分类
写法
公式举例
公式结果
备注
不分组
-
=REGEXEXTRACT("我的生日20220104","生日2022\d+")
生日20220104
返回完整结果
捕获组
(正则表达式)
=REGEXEXTRACT("我的生日20220104","生日(2022\d+)")
20220104
仅返回括号中的结果
非捕获组
(?:正则表达式)
=REGEXEXTRACT("我的生日20220104","生日(?:2022)(\d+)")
0104
用(?:)进行了匹配,但是最后只返回了 () 中的结果
此外,当正则中只有非捕获组时,将返回完整结果
关于分组,有一些实用窍门:
  • 多个分组:
使用 REGEXEXTRACT 提取内容时,可通过多个分组一次提取多列内容。如下方这样,通过 3 个括号,将内容平分在了 3 列中。
250px|700px|reset
此外,分组是可以嵌套使用的,如下方这样,多层嵌套后,就能一次拆分为 4 列:
250px|700px|reset
  • 反向引用:
在分组后写 \n (n 是一个正整数),表示引用这个分组内的值,因此你可以用 (.)\1 来匹配两个连续的重复字符。
作者Lark 帮助中心
最后更新于2023-06-01
评价此内容
提交成功,感谢你的反馈!
未能解决你的问题?请联系在线客服
0
rangeDom