首页 > 其他分享 >给Excel 添加正则表达式regexp()函数

给Excel 添加正则表达式regexp()函数

时间:2024-09-27 16:53:40浏览次数:3  
标签:FindStr arr 正则表达式 allMatches Excel RE mode myPattern regexp

WPS

推出了正则表达式函数regex家族,非常好用,必须给其点赞。听说微软在最新版本的Office也要推出,但老版本Office用户就不能使用这个函数,好在用VBA可以自定义一个函数也可以实现的,此函数不仅将三种模式融合到了同一个函数中,同时还支持数组、单元格、文本等多种数据处理

'****************************************************************************
' 函数名称: REGEXP()
' 作用: 用于正则表达式匹配、替换、测试
' 参数: FindStr 进行匹配的字符串、数组或范围
'       MyPattern 正则表达式匹配规则
'       mode 操作模式,0表示执行匹配操作,1表示执行测试操作,2表示执行替换操作
'       ReplaceWith 为要替换匹配内容的字符串
'       n 表示匹配结果的第n个,当n=0时返回全部匹配结果
'       IgnoreCase 表示是否忽略大小写,默认为False
' 返回: 以数组的形式返回结果
' 作者: wmh163
' 日期: 20240622
' 修改:
'****************************************************************************
Public Function REGEXP(ByVal FindStr, ByVal myPattern, Optional ByVal mode As Integer = 0, Optional ByVal ReplaceWith As String, Optional ByVal n As Integer = 0, Optional ByVal IgnoreCase As Boolean = False)
    ' 声明变量
    Dim i As Long
    Dim RE As Object, allMatches As Object, aMatch As Object
    ' 创建正则表达式对象
    Set RE = CreateObject("vbscript.regexp")
    RE.IgnoreCase = IgnoreCase
    RE.Global = True
    Dim tempStr
    tempStr = FindStr
    ' 判断FindStr的类型
    If TypeName(tempStr) = "String" Then
        ' 如果FindStr为字符串类型
        If TypeName(myPattern) = "String" Then
            ' 如果MyPattern为字符串类型
            RE.Pattern = myPattern
            If mode = 0 Then
                ' 匹配模式
                Set allMatches = RE.Execute(FindStr)
                If allMatches.Count >= 1 Then
                    ' 如果匹配到至少一个结果
                    ReDim rslt(1 To 1, 1 To allMatches.Count)
                    For i = 1 To allMatches.Count
                        rslt(1, i) = allMatches(i - 1).Value
                    Next i
                    If n = 0 Then
                        REGEXP = rslt
                    End If
                    If n > 0 Then
                        REGEXP = rslt(1, n)
                    End If
                Else
                    ' 如果没有匹配到结果
                    REGEXP = CVErr(2042)
                End If
            ElseIf mode = 2 Then
                ' 替换模式
                REGEXP = RE.Replace(FindStr, ReplaceWith)
            ElseIf mode = 1 Then
                ' 测试模式
                REGEXP = RE.test(FindStr)
            End If
        ElseIf TypeName(myPattern) = "Variant()" Then
            ' 如果MyPattern为数组
            ReDim arr(1 To 1, 1 To UBound(myPattern))
            If mode = 0 Then
                ' 匹配模式
                For i = 1 To UBound(myPattern)
                    RE.Pattern = myPattern(i)
                    Set allMatches = RE.Execute(FindStr)
                    If allMatches.Count >= 1 Then
                        arr(1, i) = allMatches(0)
                    Else
                        arr(1, i) = CVErr(2042)
                    End If
                Next
            ElseIf mode = 2 Then
                ' 替换模式
                For i = 1 To UBound(myPattern)
                    RE.Pattern = myPattern(i)
                    arr(1, i) = RE.Replace(FindStr, ReplaceWith)
                Next
            ElseIf mode = 1 Then
                ' 测试模式
                For i = 1 To UBound(myPattern)
                    RE.Pattern = myPattern(i)
                    arr(1, i) = RE.test(FindStr)
                Next
            End If
            REGEXP = arr
        ElseIf TypeName(myPattern) = "Range" Then
            ' 如果MyPattern为范围
            brr = myPattern
            n = UBound(brr)
            ReDim arr(1 To 1, 1 To n)
            If mode = 0 Then
                ' 匹配模式
                For i = 1 To n
                    RE.Pattern = brr(i, 1)
                    Set allMatches = RE.Execute(FindStr)
                    If allMatches.Count >= 1 Then
                        arr(1, i) = allMatches(0)
                    Else
                        '未找到返回#N/A错误
                        arr(1, i) = CVErr(2042)
                    End If
                Next
            ElseIf mode = 2 Then
                ' 替换模式
                For i = 1 To n
                    RE.Pattern = brr(i, 1)
                    arr(1, i) = RE.Replace(FindStr, ReplaceWith)
                Next
            ElseIf mode = 1 Then
                ' 测试模式
                For i = 1 To n
                    RE.Pattern = brr(i, 1)
                    arr(1, i) = RE.test(FindStr)
                Next
            End If
            REGEXP = arr
        End If
    ElseIf TypeName(tempStr) = "Variant()" Then
        ' 如果FindStr为数组
        RE.Pattern = myPattern
        ReDim arr(1 To 1, 1 To UBound(tempStr))
        If mode = 0 Then
            ' 匹配模式
            For i = 1 To UBound(tempStr)
                Set allMatches = RE.Execute(tempStr(i, 1))
                If allMatches.Count >= 1 Then
                    arr(1, i) = allMatches(0)
                Else
                    arr(1, i) = CVErr(2042)
                End If
            Next
        ElseIf mode = 2 Then
            ' 替换模式
            For i = 1 To UBound(tempStr)
                arr(1, i) = RE.Replace(tempStr(i, 1), ReplaceWith)
            Next
        ElseIf mode = 1 Then
            ' 测试模式
            For i = 1 To UBound(tempStr)
                arr(1, i) = RE.test(tempStr(i, 1))
            Next
        End If
        REGEXP = arr
    End If
End Function

标签:FindStr,arr,正则表达式,allMatches,Excel,RE,mode,myPattern,regexp
From: https://blog.51cto.com/u_16717092/12130142

相关文章

  • Vue中使用xlsx库解析Excel
    <template><div><el-uploadref="upload"class="upload-demo"action="#"accept="xlsx,xls"multiple:limit="1":auto-upload="false":withCredentials="......
  • 提高python读写excel单元格的效率
    目录1、批量写入一列与逐个写入一列的效率对比2、批量读取一行3、批量读取一列4、批量读取二维表格5、批量写入二维表格使用pywin32读写excel,如果逐个单元格访问,会明显感觉到执行效率很低。因为pywin32其实是python重新封装了一下com接口,交互效率本身就低。试了一......
  • Python办公自动化之Excel
    在日常工作中,Excel是很多办公人士必不可少的工具,而随着工作流程的复杂化,手动操作Excel的效率已无法满足高效办公的需求。那么,如何通过Python来实现Excel的自动化操作,帮助我们节省时间,提高效率呢?Python如何高效处理Excel文件?通过Python,我们可以快速地读取、修改和......
  • package.json依赖包漏洞之nodejs-glob-parent正则表达式拒绝服务漏洞
    背景有个安全扫描的流水线,扫描了负责的项目之后,发现一些漏洞。需要说明的是,这个扫描只是针对package.json文件,扫的是依赖树,而不是项目源代码,也不是打包后的代码。但既然是漏洞,都是可以好好学习下的。 nodejs-glob-parent正则表达式拒绝服务漏洞(CVE-2020-28469)被扫描出来......
  • java 解析excel (网络资源)
    在Java中解析Excel文件,可以使用ApachePOI库。以下是一个简单的例子,展示如何使用ApachePOI读取一个Excel文件(假设为.xlsx格式)的内容。首先,确保你的项目中包含了ApachePOI的依赖。如果你使用Maven,可以添加以下依赖到你的pom.xml文件中:<dependency><groupId>org......
  • 使用re的正则表达式提取腾讯体育新闻摘要
    首先确认要爬取的信息所在网页是静态还是动态,打开浏览器开发者工具抓包,下拉页面更新体育新闻的摘要(summary),同时查看网络面板,筛选fetch/xhr发起的请求的响应,随着下拉动作,能发现对https://matchweb.sports.qq.com/feeds/list的请求的增加。爬取的目标网页是动态的,第n页的请求地址为h......
  • Excel转dbc过程中出现的问题记录
    受限于python版本,无法使用canmatrix等库于是采用excel转字符串,输出到.dbc文档的方式实现DBC信息内容参见 DBC系列之DBC格式与属性说明[1]-CSDN博客遇到的问题:1、报文的DLC范围被限制为0~8,超限的报文数据都会报错解决办法:以文本文档方式打开dbc文档,添加关键字段BA_DEF_......
  • excel统计各品类亏损和涨出商品名称和金额的表
     红框是输入公式地址的地方 指定品类的情况下tep1:=FILTER(A:C,A:A=E2)在I2列输入上面的公式回车可以看到筛选出了品类1的全部结果公式解释:从A列到C列的这些范围中(第一个参数的意义)找到A列中数据等于E2的值(第二个参数的意义)(返回结果包含A到C这个范围的值)tep2:=SORT(FIL......
  • 小北用AI做了一个合并Excel的工具,全程只动嘴,不动手
    前言友友们日常工作中经常有合并excel表格的需求,比如说小北要把下面三个开票申请表合并汇总成一个总的文件。如果需要合并的文件数量少,那还可以手工的复制粘贴。如果文件数量巨大,而且格式还不一样,那估计心里就阿巴阿巴了~跟着小北5分钟上手AI代码编辑器Cursor,零基础开发Chrome......
  • EXCEL VBA 响应鼠标鼠标滚轮控制
    在vba中,我们在用户窗体中如果添加有combox控件,或者是listbox控件。正常情况下,combox和listbox是不响应鼠标滚轮事件的,且默认的VBA控件中,也没有提供响应鼠标滚轮事件的方法和入口。如此以来,我们在combox/listbox中操作选择目标选项,就只能使用滚动条来操作,严重影响了操作......