实例需求:A列为某产品名称,现需要提取其中的规格数据,具体规则如下:
- 规格数据以如下关键字开头:RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2
- 规则数据可能有多段(截图中红色部分)
- 提取规格数据之后,乘号(即x)替换为星号
- R(或者r)之前增加星号
- 剔除无意义的0和小数点,如C6和C15所示。
提取的结果如C列所示。
在上一篇博客中(请移步:VBA之正则表达式(39)-- 提取规格数据(1/2))已经实现了前4个规则。接下来看一下如何实现最后一个规则。
先来观察一下数据,需要剔除的无意义0和小数点,有如下几种情况:
规格字符串 | 说明 |
---|---|
2.2*5.2+0.20 | 剔除末尾的0 |
5*40+1.0 | 剔除末尾的0和小数点 |
Sub RegExpDemo2()
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]*(([\+]*\d+\.\d*[1-9])0*|([\+]*\d+)\.0|([rR]\d+\.\d))*|."
Set datarng = [a1].CurrentRegion
arr = datarng.Value
For r = 1 To UBound(arr)
rep1 = .Replace(arr(r, 1), "$1$3$4$5")
rep2 = Replace(rep1, "x", "*")
rep3 = Replace(UCase(rep2), "R", "*R")
arr(r, 1) = "'" & rep3
Next
End With
datarng.Offset(0, 4).Value = arr
Set objRegEx = Nothing
End Sub
【代码解析】
与上一篇博客相同的代码这里不再赘述。
第6行代码设置匹配规则,其中前半部分也是相同的,只需要讲解(([\+]*\d+\.\d*[1-9])0*|([\+]*\d+)\.0|([rR]\d+\.\d+))*|.
。
|正则表达式|说明|示例|
|:-|:-|:-|:-|
|([\+]*\d+\.\d*[1-9])0*
|匹配加号开头(可以没有),一个或者多个数字,跟随小数点,之后一个或者多个数字(最后一个数字非0),之后可以跟随任意个0|提取+0.20
中的+0.2
|
|([\+]*\d+)\.0
|匹配加号开头(可以没有),一个或者多个数字,跟随小数点和0|提取+1.0
中的+1
|
|([rR]\d+\.\d+)
|匹配r
或者R
开头,一个或者多个数字,跟随小数点,之后为一个或者多个数字|匹配R/r数据|
如果数据中R
部分也包含无意义0,那么将需要参照上表中的方法,进行进一步低拆分。
最终匹配结果和提前组如下图所示,匹配组4和5实现了剔除无意义0。
运行示例代码提取的规格数据保存在E列中,如下图所示。
对于复杂的数据提取规则,不妨分成几个部分逐步实现,这样便于测试与发现问题。本博客提供的正则规则也只是一种实现方式,欢迎读者提供更优秀的实现方式。
测试数据如下:
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