实例需求:A列为某产品名称,现需要提取其中的规格数据,具体规则如下:
- 规格数据以如下关键字开头:RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2
- 规则数据可能有多段(截图中红色部分)
- 提取规格数据之后,乘号(即x)替换为星号
- R(或者r)之前增加星号
- 剔除无意义的0和小数点,如C6和C15所示。
提取的结果如C列所示。
这个需求略显复杂,直接写一个完整的正则有些难度,当然肯定有高手可以一气呵成,为了便于讲解,先忽略最后剔除数字的规则。
示例代码如下:
Sub RegExpDemo_1()
Dim objRegEx As Object
Set objRegEx = CreateObject("vbscript.regexp")
With objRegEx
.Global = True
.Pattern = "(?:RO|RE|SQ|SD|QD|OB|HX|ET|QR|D2)\s([\d\.x]+)[\sm]*([rR\+]*[\d.]+)*|."
Set datarng = [a1].CurrentRegion
arr = datarng.Value
For r = 1 To UBound(arr)
rep1 = .Replace(arr(r, 1), "$1$2")
rep2 = Replace(rep1, "x", "*")
rep3 = Replace(UCase(rep2), "R", "*R")
arr(r, 1) = "'" & rep3
Next
End With
datarng.Offset(0, 3).Value = arr
Set objRegEx = Nothing
End Sub
【代码解析】
第3行代码创建正则表达式对象。
第5行代码设置全局匹配。
第6行代码设置匹配规则。
正则表达式 | 说明 | 匹配字符 |
---|---|---|
`(?:RO | RE | SQ |
\s | 匹配一个白字符 | 空格 |
([\d\.x]+) | 匹配一个或者多个如下字符:数字、小数点、小写字母x | 6.3x36.6 |
[\sm]* | 匹配任意多个如下字符:白字符或者m | 空格 |
[rR\+]* | 匹配任意多个如下字符:r 、R 或者加号 | R |
[\d.]+ | 匹配任意一个或者多个数字可以包含小数点 | 0.8 |
|. | 匹配其他任意字符,用于正则替换 |
以Fump Chunp Size 2A QR 6.3x36.6 R0.8 BT1° RT TINC
为例,最后一列展示匹配结果。
部分数据匹配结果如下图所示,从中可以看出匹配组1和2为需要提取的规格数据。
第7行代码获取A1单元格的当前数据区域。
第8行代码将数据读取到数组中。
第9~14行代码循环处理数据。
第10行代码使用匹配组1和2进行正则替换。
第11行代码将x
替换星号。
第12行代码将规则转换为大写字符,然后在R
之前增加星号。
第13行代码在规则数据其中增加半角引号,使得规格按文本数字格式写入到单元格中
第16行代码将提取的规则数据写入D列单元格中。
提数数据如下图所示,标记为绿色的单元格,表示与要求的结果一张,观察一下可以发现,不一致规格数据都需要剔除多余的数字,下一篇博客讲解如何实现这个规则。
测试数据如下:
Fump 241 Chunp Size1 SH-QR 18x18r0.3 Rooft. 1°bt
Fump Chunp Size 2A QR 6.3x36.6 R0.8 BT1° RT TINC
Fump Chunp Size 1 RO 28mm TINC RoofTop
Fump Chunp Size 1 RO 6mm TINC
Lutra Chunp “A” SH-RE 2.2x5.2mm
TKH ide “A” SH-RE 2.2x5.2mm +0.20 SF
Lutra Chunp “A” SH-RE 1.2x5.5mm stubby
Lutra Stripper “A” SH-RE 1.2x5.5mm
TKH ide “A” SH-RE 1.2x5.5mm +0.20 SF
Lutra Chunp “A” RO 6.1mm
TKH ide “A” RO 6.1mm +0.20 SF
Lutra Stripper “B” RE 2x10mm
Fump ide Size 1 RO 5mm +0.6 SP
Fump ide Size 1 SH-HX 7.1mm +0.3 SP
Fump ide Size 2 SH-OB 5x40mm +1.0 SP
Fump Chunp HD Size1 SH-OB 8x30mm RT 1°BT
Fump ide Size 2 HD SH-OB 8x30mm +1.85 SP
Fump Chunp HD Size1 SH-OB 5x30mm RT 1°BT
Lutra Chunp “B” SH-RE 1.5x15mm stubby
Lutra Stripper “B” SH-RE 1.5x15mm
TKH ide “B” SH-RE 1.5x15mm +0.20 SF
Lutra Chunp “B” SH-RE 5x20mm
TKH ide “B” SH-RE 5x20mm +0.20 SF
TKH ide “A” SH-RE 1.1x6mm +0.20 SF
Fump Chunp Size 2C RO 55mm RoofTop