在Excel中像使用函数一样优雅的使用正则表达式!
从杂乱的数据中提取数值、提取字母、汉字这样的需求,实在是太常见了,我浏览论坛几乎每天都可以看到很多,以至于我想Excel应该有一个这样的函数。但是没有,于是我自己写了一个,也是为了方便在Excel中练习,所以有了今天这篇!
首先提供一些简单常用的提取写法,比如提取数值(+sz),我们要我们从字符串中删除数值可以使用-sz,第三参数默认0即可"-hz" '删除汉字
"-zm" '删除字母
"-sz" '删除数字
"+hz" '提取汉字
"+zm" '提取字母
"+sz" '提取数字
适用于简单的替换和提取! 如果复杂一些的,我们可以自己写正则表达式提取,比如多数值提取
=INDEX(RegFun($A2,"(-?\d+)(\.\d+)?"),COLUMN(A1))
(-?\d+)(\.\d+)? : 用于匹配浮点数
多个结果的情况下,RegFun的结果是一个数组,可以使用Excel自带的一些可以从数组中取数的函数配合使用!MS365可以直接输入(动态扩展)
?=\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额,对了,不会看到这里你跟我讲,你不会正则吧!如果是,还不赶紧去学保存为加载宏,即可在本机打开的任意工作薄中使用该函数!
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。