|
jbjbzjb 发表于 2014-1-13 18:22
fdfsddfsdf
请看我强大的多功能正则提取自定义函数:- Function TQ(txt, Optional k = 0, Optional pt = 1)
- If IsNumeric(pt) Then pt = Choose(pt, "\w", "[^a-zA-Z]", "\D", "[^a-z]", "[^A-Z]", "\W", "\d")
- With CreateObject("VBScript.RegExp")
- .Global = True
- .Pattern = pt
- If .test(txt) Then
- If k = 0 Then
- TQ = .Replace(txt, "")
- ElseIf k > 0 Then
- TQ = .Execute(txt)(k - 1)
- Else 'k < 0
- TQ = .Execute(txt)(Int(-k) - 1).SubMatches(Mid(k, InStr(k, ".") + 1) - 1)
- End If
- Else
- TQ = ""
- End If
- End With
- End Function
复制代码 自定义函数说明:
第一参数【txt】:必须,为提取对象字符串或其单元格引用地址
第二参数【k】:提取模式、兼提取位置
默认k=0时为Replace模式,按pattern进行replace置换
k>0正数时为Matches模式, 返回按pattern提取同类组后第k组的字符结果
k<0的负小数时为SubMatches模式,返回按多组pattern提取后[整数部分]大组的[小数部分]小组的字符结果
整数部分为:Int(-k) - 1)
小数部分未:Mid(k, InStr(k, ".") + 1) - 1
如k=-3.1 即为提取第3组的第1小组部分字符 → 3.1
第三参数【pt】:正则pattern,输入或默认常用pattern
该参数为1-7的有效数值时,使用默认预置的常用pattern效果如下:
参数pt pattern 效果
=1 \w or [0-9a-zA-Z] or [a-zA-Z0-9] 匹配置换英数字符,保留返回文字字符。
=2 [^a-zA-Z] 匹配置换非英字符,保留返回英文字符。
=3 \D 匹配置换非数字符,保留返回数字字符。
=4 [^a-z] 匹配置换非小写英字,保留返回小写英字符。
=5 [^A-Z] 匹配置换非大写英字,保留返回大写英字符。
=6 \W or [^0-9a-zA-Z] 匹配置换非英非数字,保留返回英数字符。
=7 \d 匹配置换数字字符,保留返回英字以及汉字字符。
…………
本题可以采用pattern为:"\d+[a-zA-Z]+"
k参数选=3 (正数为Matches第k组模式)
因此,输入公式=TQ($A5,3,"\d+[a-zA-Z]+") 然后下拉即可。
…………
注意,某些特殊类型可能会导致不符合楼主的要求……
但需要楼主明确规则以后,进行代码补丁修正,但一般说可以达到楼主要求。
|
|