正则表达式(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代码解释参见代码注释吧。
技术交流,软件开发,欢迎微信沟通:




















