一、关于正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),它是一种文本模式,同时也是计算机科学的一个概念,其中包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为’元字符’)。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是处理文本的天花板,没有之一的那种。本文将列举8组案例,每个案例会给出实现的正则表达式,会给出不同的实现方法和案例总结。
正则表达式
二、案例
2.1 案例1:求出单元格费用之和
需求:提取每一行单元格内所有费用,并求出每行费用之和,如下图所示。
合计的正则表达式:=SUM(REGEXP(B4,'[0-9]+’)/1)
2-1-1 单元格费用求和(整数)
2-1-1案例总结:
1) 正则表达式需要双引号 “” 括起来
2) [0-9] 数字 单个数字
3) + 量词 1位或多位
4) 正则REGEXP与MID,LEFT,TEXT,FIND,SUBSUTITE等都为文本类函数,提取的数字为文本类型,需运算后(如:+0,-0,*1,/1等)才可以进行SUM求和。
正则表达式:=SUM(REGEXP(B4,'[0-9.]+’)/1)
2-1-2 单元格费用求和(含小数)
2-1-2案例总结:
1)[0-9.] 字符集 或者 单个字符
2)[ ] 有啥提取啥 或者
2.2 案例2: 提取员工姓名和员工编号
需求:分别提取单元格内的员工姓名、员工编号
员工姓名的正则表达式 =TOCOL(REGEXP(B4,'[一-龟]+’))
2-2-1 提取员工姓名(汉字)
2-2-1案例总结:
1)[一-龟] 文本,单个汉字
2)+ 量词 1位或多位
3)TOCOL 用于将多列数据转换为一列数据
员工编号的方式1正则表达式 =TOCOL(REGEXP(F4,'[A-Za-z0-9-]+’))
员工编号的方式2正则表达式 =TOCOL(REGEXP(F4,'[A-Za-z-]+[0-9]+’))
员工编号的方式3正则表达式 =TOCOL(REGEXP(F4,'[w-]+’))
2-2-2 提取员工编号(包含大小写字母,数字,横线)
2-2-2案例总结:
1)学好正则需要仔细观察数据组成:如号工编号 有大小写字母开头,中间有横杠,后面跟的是数字等。
2)[A-Za-z0-9-] A-Z或者a-z或者0-9或者- 单个字符
3)[A-Za-z-]+[0-9]+ 字母或符号+数字 这样的顺序组合
4)w 匹配单个字母数字和下划线 (元字符)
W 匹配任何非单词字母(空格、各类符号,不能识别的下划线) (元字符)
2.3 案例3:
需求:提取单元格中涉及的产品和金额
产品的方式1正则表达式 =TOCOL(REGEXP(B4,'[一-龟]{2,9}+’))
产品的方式2正则表达式 =TOCOL(REGEXP(B4,'[一-龟]+(?=[0-9-])’))
2-3-1 提取产品信息
2-3-1案例总结:
1){2,9} 量词,2到9位
2){2,} 量词,大于等于 2位
3){n} 量词,n位数
4) (?=[0-9]) 匹配数字前面位置(零宽断言)
5) 零宽断言总结:
2-3-1 零宽断言总结
金额的方式1正则表达式 =TOCOL(REGEXP(B4,'[0-9.-]+’))
金额的方式2正则表达式 =TOCOL(REGEXP(B4,'[d.-]+’))
2-3-2提取金额信息
2-3-2案例总结:
1)[0-9.-]+ 0-9或 .(小数点)或 –(负号)1位或多位

2)d 任何数字,与[0-9]相同 (元字符)
D 任何非数字,与[^0-9]相同 (元字符)
2.4 案例4:
需求:分别提取数据中的姓名、手机号、籍贯、出生日期、车牌号
姓名提取的正则表达式 =REGEXP(B4,’^[一-龟]+’)
手机号提取的正则表达式 =REGEXP(B4,'[0-9]{10,}’)
籍贯提取的正则表达式 =REGEXP(B4,’出生地:K[一-龟]+’)
出生日期提取的正则表达式 =REGEXP(B4,'[0-9]+年[0-9]+月+[0-9]+日’)
车牌号提取的正则表达式 =REGEXP(B4,’车牌K[一-龟][A-K]+[0-9]{5,}’)
2-4-1提取姓名、手机号、籍贯、出生日期、车牌号
2-4-1案例总结:
1)^ 匹配开头
2)[0-9]{10,} 表示号码位数大于等于 10 (测试数据为10位手机号)
3)K 砍一刀 舍左留右
4)出生地:K[一-龟]+ 舍去左边出生地: 部分文字,保留右边1或多位 文字
5)[0-9]+年[0-9]+月+[0-9]+日 XX年XX月XX日
6)车牌K[一-龟][A-K]+[0-9]{5,} 舍去左边车牌部分文字,保留右边1个汉字+1位或多位字母+5位及以上数字
2.5 案例5:
需求:拆解右边发货数据,拆解货号、颜色、尺码、数量信息
货号拆解方式1的正则表达式 =REGEXP(B4,’^[A-Za-z0-9]+(?=[一-龟])’)
货号拆解方式2的正则表达式 =CHOOSECOLS(REGEXP(B4,'[A-Za-z0-9]+(?=[一-龟])’),1)
颜色拆解方式1正则表达式 =REGEXP(B4,'[一-龟]+(?=[0-9]+码)’)
颜色拆解方式2正则表达式 =REGEXP(B4,'[一-龟]+色’)
尺码拆解的正则表达式 =REGEXP(B4,'[0-9]+(?=码)’)
数量拆解的正则表达式 =REGEXP(B4,’码K[0-9]+’)
2-5-1拆解货号、颜色、尺码、数量
2-5-1案例总结:
1)^ 匹配开头
2)CHOOSECOLS函数选择指定列数
3)(?=[0-9]+码) (?=[0-9]+码) 匹配1位或多位数字+码 前面位置(零宽断言)
4)码K[0-9]+ 舍去左边码部分,保留右边1位或多位数字
2.6 案例6:
需求:拆分考勤数据,拆出4笔打卡数据
打卡数据拆分方式1的正则表达式 =REGEXP(C4,’.+’)
打卡数据拆分方式2的正则表达式 =REGEXP(C4,'[0-9]{2}:[0-9]{2}’)
2-6-1拆出4笔打卡数据
2-6-1案例总结:
1). 匹配除n的任何单个字符
2)n 匹配换行符
3)[0-9]{2}:[0-9]{2} 2位数字 :2位数字
2.7 案例7:
需求:提取左边数据中的规格
规格提取方式1的正则表达式 =REGEXP(B4,'[0-9*]+(?=规格)’)
规格提取方式2的正则表达式 =REGEXP(B4,'[d*]+(?=规格)’)
2-7-1 提取规格
2-7-1案例总结:
1)[0-9*]+(?=规格) 取规格前的 1位或多位数字或 *
2)d 任何数字,与[0-9]相同 (元字符)
3)[d*]+(?=规格) 取规格前的数字或 *
2.8 案例8:
需求:提取左边数据中的姓名、地址、件数信息
姓名提取的正则表达式 =REGEXP(B4,’^[一-龟]+’)
地址提取的正则表达式 =REGEXP(B4,’ K[一-龟0-9 ]+号’)
件数提取的正则表达式 =REGEXP(B4,'[0-9]+件’)
2-8-1提取姓名、地址、件数
2-8-1案例总结:
1)^[一-龟]+ 开头是1位或多位汉字
2)K[一-龟0-9 ]+号 舍去1位或多位汉字或数字或空格加上号前的数据,即舍弃姓名部分数据,取右边号及前面的地址数据。
三、正则的元字符
正则表达式中的元字符是具有特殊含义的字符,用于定义匹配规则。以下是常见元字符及其功能:
核心元字符
- s:匹配单个空格符(包括tab键和换行符)
- d:匹配数字(0-9)
- w:匹配字母、数字或下划线(等价于[A-Za-z0-9_])
- .*?:.:匹配除换行符外的任意字符
- ?:匹配0次或1次前导字符
- +:匹配1次或多次前导字符
- *****:匹配0次或多次前导字符
位置相关
- ^:匹配字符串开始位置
- $:匹配字符串结束位置
频率控制
- {n}:匹配固定n次
- {n,m}:匹配n到m次(含n和m)
- ?:非贪婪模式,尽可能少匹配字符
其他
- S:匹配除空格外的所有字符
- B:匹配单词边界(具体实现可能因环境而异)