156、Excel 365新增函数介绍之五---正则表达式REGEXEXTRACT函数应用示例 上一节简单介绍了正则表达式REGEXEXTRACT函数的语法及常用规则。这里通过一些应用示例来说明该函数的具体用法,有兴趣的朋友也可以跟早期版本的文本提取函数(left、mid、right)进行比较,从中感受REGEXEXTRACT函数的强大之处。一、提取相应信息:手工记录了报名信息,因为记录没有规范的问题,每个人记录的方式大不相同,现在将记录信息转换为电子文本并存放在A列,要求根据A列的数据提取对应的“姓名”、“科目”、"课时"信息。如下图所示:思考:如果使用之前的文本提取函数(left、mid、right)会发现比较麻烦,因为记录的规则不统一,存放顺序以及要提取内容的长短均各不相同。正则表达式函数正好可以解决这些问题。提取:在B2单元格输入公式“=BYROW(A2:A4,LAMBDA(x,REGEXEXTRACT(x,"[一-龟]+")))”,公示最外层使用byrow函数,将A列的数据作为其第一个参数,以数组形式进行溢出,避免还要下拉复制。嵌套LAMBDA函数,将A列的数据定义为变量,内部嵌套正则提取函数,REGEXEXTRACT函数中参数"[一-龟]+"为正则表达式的模式,表示提取连续的“中文字符”,提取字符数量不限。C2单元格中输入公式“=BYROW(A2:A4,LAMBDA(x,REGEXEXTRACT(x,"[A-Za-z]+")))”,正则表达式中参数"[A-Za-z]+"表示提取连续的"英文字符",不论大写还是小写。D2单元格中输入公式“=BYROW(A2:A4,LAMBDA(x,REGEXEXTRACT(x,"\d+(\.\d+)?")))”,正则表达式中参数"\d+(\.\d+)?"表示提取连续的“数字字符”,(\.\d+)?表示小数点及其后边的数字字符,后边的“?”表示小数点及其后边的数字可以出现,也可以不出现。提取结果下图所示:二、计算费用总额:在A列中记录了各项费用信息,现在要计算总费用。如下图所示:思考:费用信息栏中记录的数据有以下特点:日期、数量、金额这些数值混杂在一起;数值有整数也有小数;费用的单位有元,有块。显然想通过传统的文本提取函数来完成是非常艰难的。要求总费用,就两个步骤:提取对应的费用→求和。step1、提取费用:通过观察我们可以看到费用就是“元”或“块”之前的小数或整数数值。据此我们就可以得到提取参数中模式的表达式,比如:在C8单元格输入公式“=REGEXEXTRACT(A8,"\d+(\.\d+)?(?=[元块])",1)”,公式中参数"\d+(\.\d+)?(?=[元块])"的\d+表示提取连续的数字,(\.\d+)?表示小数点“.”出现或者不出现,(?=[元块])表示字符“元”或“块”之前的字符。这样便提取了所有的费用信息,如下图所示:Step2、求和:将上一步提取的所有费用求和。首先在上一步的公式外边嵌套sum函数,看看结果。嵌套后结果返回0,显然不对,如下图:结果之所以错误是因为,所有文本提取函数返回的值都是文本类型,不是数值,要求和需要进行减负或者乘以1转换(或者嵌套value函数)。经过这一转换公式返回了正确结果,如下图所示:Step3:将最后公式复制到B列对应单元格,下拉复制返回对应的结果,如下图所示:拓展:当然也可以通过byrow函数以数组溢出的形式自动填充,比如将B8单元格的公式改为“=BYROW(A8:A9,LAMBDA(x,SUM(--REGEXEXTRACT(x,"\d+(\.\d+)?(?=[元块])",1))))”,则可以直接得到对应行的费用总额。如下图所示:三、提取图号:A列中放置了系统导出的描述信息,需要从中提取相应的图号。通过观察可以看出,描述中的图号信息有全数字的,有字母开头或夹杂在中间的,有1个2个3个4个字母的,图号在描述中的位置也是不固定,图号的长度也是不一样。在B2单元格输入“=REGEXEXTRACT(A2,"[0-9A-Z]{1,5}\d+[A-Z]?\d{4,}",1)”,[0-9A-Z]{1,5}表示以字母或数字开头,位数为1-5位;\d+表示数字,不限个数;[A-Z]?判断中间是否有夹杂字母的;\d{4,}夹杂字母后边4位及以上数字。提取结果如下图所示:可以嵌套TEXTJOIN函数将提取的多个图号换行合并到一个单元格,如下图所示:小结:通过上边的两个小小的示例,估计各位朋友已经看到正则表达式在文本提取方面的强大魅力了,面对复杂的情形可以简单化,这是因为它是根据文本的样式来进行提取的,而不是像left、mid、right之类需要具体的字符位置信息才能去确定提取的内容。当然,在实际工作中会遇到的情景还会更加的复杂,此时,更需要静下心来仔细观察文本的特点及其类别,将所有的类别都考虑到,不要遗漏。