正则表达式(Regular Expression),又称为“正则式”、“规则表达式”、“常规表示法”,是一种用来匹配、查找、替换字符串的工具。它通过一定的符号、元字符和操作符的组合来表达一个特定的模式,从而匹配符合该模式的字符串。关于正则表达式的基本使用方法我们放在第二条文章。
今天我们分享的是一个提取0-9数字的自定义函数GetNum,在工作表、VBA中均可使用。
函数使用:
1、A列我用mid函数、randbetween函数等模拟了一些文本与数字混合的字符串。
2、B列是以前的一个函数,可能是网上抄来的,记不清了。不管它,留着吧。
3、C列用GetNum函数,取A列字符串中的数字,不带参数,表示提取所有数字。
4、D列用GetNum函数,取A列字符串中的数字,第一个参数表示取第几个匹配结果,第二个参数表示连续数字的长度,联合起来表示符合指定长度的第几个数字。如果第二个参数省略,则表示匹配第几个数字,不管长度。
5、E列、F列同样用法。F列提取了第1个11位的连续数字,我们可以用来提取电话号码。
函数代码:
Function GetNum(str As String, Optional MatchType As Integer = 0, Optional MatchLen As Integer = 0)
'函数参数2个,默认为0,表示提取所有数字,
'MatchType,匹配类型,如果为0,表示提取所有数字,忽略第二参数,如果不为0,表示匹配第n个符合条件的元素
'MatchLen,匹配长度,指定提取的连续数字的长度,如果0,表示任意长度,不为0,则提取参数值长度的连续数字
'设第一参数=m,第二参数=n,如果m,n同时不为0,则表示提取第m个长度为n的连续数字。
Dim regEx As Object
Dim Result As String
k = 0
Set regEx = CreateObject("VBScript.RegExp")
With regEx
.Global = True
.Pattern = "\d+" '匹配一个及以上连续数字,那就是所有数字
End With
Set Matches = regEx.Execute(str) '进行匹配,匹配结果存到Matches
For i = 0 To Matches.Count - 1 '循环,根据参数取得匹配结果
If MatchType = 0 Then
Result = Result & Matches.Item(i).Value
Else
If MatchLen = 0 Then
If i = MatchType - 1 Then
Result = Matches.Item(i).Value
Exit For
End If
Else
If Len(Matches.Item(i).Value) = MatchLen Then
k = k + 1
End If
If MatchType = k Then
Result = Matches.Item(i).Value
Exit For
End If
End If
End If
Next
GetNum = Result
End Function
代码解释参见代码注释吧。
技术交流,软件开发,欢迎微信沟通: