一、关于正则表达式

正则表达式,又称规则表达式,(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位或多位

Excel 正则文本提取天花板

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:匹配单词边界(具体实现可能因环境而异)