在Excel中像使用函数一样优雅的使用正则表达式

从杂乱的数据中提取数值、提取字母、汉字这样的需求,实在是太常见了,我浏览论坛几乎每天都可以看到很多,以至于我想Excel应该有一个这样的函数。但是没有,于是我自己写了一个,也是为了方便在Excel中练习,所以有了今天这篇!
我们随便找一些网上实际的案例来一个一个解决吧!
案例1:提取数值
首先提供一些简单常用的提取写法,比如提取数值(+sz),我们要我们从字符串中删除数值可以使用-sz,第三参数默认0即可
还提供了以下简写参数(正负+首字母):
"-hz"   '删除汉字               "-zm" '删除字母"-sz"   '删除数字"+hz"   '提取汉字"+zm" '提取字母"+sz"   '提取数字
适用于简单的替换和提取! 如果复杂一些的,我们可以自己写正则表达式提取,比如多数值提取
案例2:多组数值提取
=INDEX(RegFun($A2,"(-?\d+)(\.\d+)?"),COLUMN(A1))
(-?\d+)(\.\d+)?    : 用于匹配浮点数
多个结果的情况下,RegFun的结果是一个数组,可以使用Excel自带的一些可以从数组中取数的函数配合使用!MS365可以直接输入(动态扩展)
案例3:综合提取-中文、数值和英文
[\u4e00-\u9fa5] :表示汉字
?=\d :在目标文本中,只有数字前面的汉字才会得到匹配()
VBA正则也是支持“零宽断言”,但是只支持正向环视!这是我们只是简单提一下,以后我们有机会再专门写关于正则表达式的专题!正则非常有意思!
更多案例我们就再举了!下面是代码,只是简单的写了一下,目前没有写subMatches部分!不是非常的完善,懂VBA且有兴趣的同学可以自行改写
源码
Option Explicit

'作者:小易
'公众号:Excel办公实战
'功能:正则表达式简易封装
'-------------------------------------------------------
Function RegFun(str As String, sPattern As String, _
                Optional bType As Boolean = True, _
                Optional bGlobal As Boolean = True, _
                Optional bMultiLine As Boolean = False, _
                Optional bIgnoreCase = False)
    Dim oReg As Object, oMatches As Object
    Dim arr(), i As Long, oMatch As Object
    Set oReg = CreateObject("VbScript.RegExp")
    With oReg
        .Global = bGlobal
        .MultiLine = bMultiLine
        .IgnoreCase = bIgnoreCase
        If bType Then
            .Pattern = sPattern
            Set oMatches = .Execute(str)
            If oMatches.Count > 0 Then
                For Each oMatch In oMatches
                    i = i + 1
                    ReDim Preserve arr(1 To i)
                    arr(i) = oMatch.Value
                Next
                RegFun = arr
            Else
                RegFun = ""
            End If
        Else
            Select Case sPattern
            Case Is = "-hz"   '去汉字
                .Pattern = "[一-﨩]"
            Case Is = "-zm" '去字母
                .Pattern = "[a-zA-Z]"
            Case Is = "-sz"   '去数字
                .Pattern = "[0-9\.]"
            Case Is = "+hz" '取汉字
                .Pattern = "[^一-﨩]"
            Case Is = "+zm"   '取字母
                .Pattern = "[^a-zA-Z]"
            Case Is = "+sz" '取数字
                .Pattern = "[^0-9\.]"
            End Select
            RegFun = .Replace(str, "")
        End If
    End With
End Function

额,对了,不会看到这里你跟我讲,你不会正则吧!如果是,还不赶紧去学
超有意思的额!找不到教程的就等小编再写吧!
如何使用参考:如何使用VBA(宏)代码
保存为加载宏,即可在本机打开的任意工作薄中使用该函数!

本文由“壹伴编辑器”提供技术支持

(0)

相关推荐