本文参考:
https://blog.youkuaiyun.com/laoyebin/article/details/5377857(EXCEL里常用的几个正则表达式)
https://blog.youkuaiyun.com/catoop/article/details/70247105(Excel 正则表达式提取值)
- 今天一个朋友让我帮忙将一组 淘宝的宝贝标题里面提取出型号:
A | B | |
1 | 商品名称(比较典型的原始数据) | 型号(输出结果) |
2 | 美的(Midea) 电饭煲 智能IH加热 家用电饭锅 4L MB-FS4006 | MB-FS4006 |
3 | 美的(Midea) 多用途锅 4.5L 家用电火锅鸳鸯锅 1500W MC-WLHN32A | MC-WLHN32A |
4 | 美的(Midea) 电水壶HE1504a 家用便捷式烧水壶四段温304不锈钢电热水壶 | HE1504a |
5 | 美的(Midea)电热水瓶PF708c-50T双出水5段温控 家用5升电热水壶304不锈钢电水壶 | PF708c-50T |
6 | 美的(Midea)电压力锅 IH电磁加热可中途加菜钢胆5L高压锅 MY-HT5077P | MY-HT5077P |
7 | 美的(Midea) 破壁机 真空辅食机 智能家用多功能果汁机 榨汁机 MJ-BL1507A | MJ-BL1507A |
8 | 美的(Midea) 电磁炉 恒匀火 十档火力调节 一键桑拿蒸C21-QH2130(赠不锈钢蒸锅) | C21-QH2130 |
9 | 美的(Midea)电炖锅 煲汤锅 电砂锅 隔水炖 火山陶釜三胆 4L电炖盅 TGS40W | TGS40W |
10 | 美的(Midea)电热水壶即热式不锈钢电水壶 6段温控烧水壶 3L/3升台式饮水机MK-HE3001 | MK-HE3001 |
11 | 美的(Midea)电磁炉 纤薄匀火滑动触控 家用火锅炉 C21-RH2153火力时间双显示 | C21-RH2153 |
12 | 美的(Midea) 电磁炉HST2105 红外火力 不挑锅具 红外炉双环控火电陶炉 | HST2105 |
13 | 美的(Midea)电饭煲 2L智能IH加热 家用迷你智能预约触摸操控 小电饭锅MB-FZ2001 | MB-FZ2001 |
14 | 美的(Midea)电压力锅 球形内胆可作电饭煲 5L压力锅 家用双胆高压锅YL50Easy301 | YL50Easy301 |
15 | 美的(Midea)电饼铛MC-JK30Easy301家用煎烤机双面加热煎饼铛早餐机自动断电煎饼机 | MC-JK30Easy301 |
16 | 美的(Midea) 空气炸锅 家用全自动 高光耐热PP材料白色 MF-WZN3201空气无油炸锅 | MF-WZN3201 |
17 | 美的(Midea) 多用途锅 多功能家用电火锅 蒸锅 6L MC-LHN30C | MC-LHN30C |
18 | 美的(Midea) 电饭煲 3L家用智能预约 不锈钢拉丝机身电饭锅 MB-FS3073 | MB-FS3073 |
19 | 美的(Midea)电热水瓶 热水壶电水壶304不锈钢 电热水壶热水瓶MK-SP50Colour201 | MK-SP50Colour201 |
20 | 美的(Midea)多用途锅ZG26EASY401 食品级不锈钢 三层大容量电蒸锅 电蒸笼 | ZG26EASY401 |
- 从网友catoop的https://blog.youkuaiyun.com/catoop/article/details/70247105的文章中引用到如下VBA函数代码:
Function GetStr(rng As Range)
With CreateObject("VBscript.regexp")
.Global = True
.Pattern = "\d+\*\d+\+{0,1}\d{0,}" '表达式
If .Execute(rng).Count = 0 Then
GetStr = ""
Else
GetStr = .Execute(rng)(0)
End If
End With
End Function
- 因为我要测试表达式,所以需要在表格中不断的修改正则表达式,于是将上述代码稍加修改后得到:
(代码的用法就不敷述了)
Function GetStr(rng As Range, str As String)
'第一个参数rng为区域保持不变, 添加第二个参数str(作为正则表达式)
With CreateObject("VBscript.regexp")
.Global = True
.Pattern = str '表达式,直接从用户函数的第二个参数中调用
If .Execute(rng).Count = 0 Then
GetStr = ""
Else
GetStr = .Execute(rng)(0)
End If
End With
End Function
下面介绍一下我所用的正则表达式以及思路:
- B1单元格中函数如下:
=getstr(A1,"((?!Midea)(?![0-9]{3,})[\w]{1,19}[-]{1}[\w]{1,19})|(?!Midea)(?![0-9]{3,})[0-9A-Z]{0,19}[-]{0,1}[0-9A-Z]{1}(\w{3,10})")
第二个参数的的内容为从‘ | ’这个符号分成两部分理解:
- ((?!Midea)(?![0-9]{3,})[\w]{1,19}[-]{1}[\w]{1,19})
其中:
(?!Midea) 表示不包含字符“Midea” 因为每一行里面都有这个
(?![0-9]{3,})表示不包含以3个及以上的数字组合的开头(故将其放置在前面),目的是为了排除第三行中的1500W
[\w]{1,19}数字及大小写字母1,19个长度的组合
[-]{1} 紧接着后面一定会有一个“-”减号
[\w]{1,19}最后数字及大小写字母1,19个长度的组合,之所以是19这个数只是为了能够包含住所有应该匹配到的型号
这样的结果就是所有带有“-”减号的型号 - (?!Midea)(?![0-9]{3,})[0-9A-Z]{0,19}[-]{0,1}[0-9A-Z]{1}(\w{3,10})"
这是“|”符号后面的部分,“|”表示“或”的意思,即前面的没有匹配到就用后面的匹配
前面的一样的就不重复介绍了,从不一样的开始介绍:
[0-9A-Z]{0,19}开头为数字或大写字母,且长度为0到19位字符的(因为是从0开始的,所以可以有也可以没有)
[-]{0,1}表示后面紧接零个或者1个“-”减号
[0-9A-Z]{1}前面两个有可能都没有,也就是说这里有可能是开头的字符,必须为大写字母或数字
(\w{3,10})最后的字符可以是大小写字母或数字,长度为3到10个字符
源文件下载:
https://download.youkuaiyun.com/download/qq_25846269/11159568