前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA:正则表达式(1) - 基础篇

VBA:正则表达式(1) - 基础篇

作者头像
Exploring
发布2023-09-10 15:41:32
1.4K0
发布2023-09-10 15:41:32
举报

正则表达式,常被用来检验、替换符合某个模式(规则)的字符串,在代码中常缩写为regexp。VBA中并没有直接提供正则表达式的对象,需要借助VBScript的正则对象。

如果使用前期绑定,那么就需要在VBE中引用如下扩展库。

也可以使用后期绑定的方式创建正则对象,代码如下:

代码语言:javascript
复制
Set objRegEx = CreateObject("vbscript.regexp")
1 正则对象的属性和方法

正则对象有四个属性和三个方法。

属性:

  • Global,是否全局匹配;若为False,匹配到一个结果之后,就不再匹配。默认False,建议取True。
  • IgnoreCase,是否忽略大小写;默认False,建议取False,这个会影响到正则表达式的匹配。
  • Multiline,是否跨行匹配;默认False,建议取False,这个会影响到正则表达式的匹配。
  • Pattern,指定用于搜索的正则模式。

方法:

  • Execute,执行匹配,将正则模式应用于字符串,并返回Matchs集合。
  • Replace,根据正则表达式全部替换。
  • Test,测试正则表达式能否匹配到内容,返回Boolean值说明匹配是否成功。
2 示例

待处理的文本如下,提取其中的姓名汉字和电话数字。

Name:张三丰,Phone:13801380000

VBA代码如下:

代码语言:javascript
复制
Option Explicit

Sub RegExpDemoSyntax()

    Dim objRegEx As Object, myString As String, objMH As Object, retStr As String
    
    Set objRegEx = CreateObject("vbscript.regexp")
    
    objRegEx.Pattern = "Name:(.*?),Phone:(\d+)"
    
    objRegEx.Global = True
    
    myString = "Name:张三丰,Phone:13801380000"
    
    Set objMH = objRegEx.Execute(myString)
    
    If objMH.Count > 0 Then
        
        With objMH(0)
            
            retStr = "名字:" & .SubMatches(0) & vbNewLine
            
            retStr = retStr & "电话号码:" & .SubMatches(1)
        
            MsgBox retStr
            
        End With
        
    End If
    
    Set objRegEx = Nothing
    
End Sub

运行结果:

重点解析:

(1)Execute – 对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。Execute方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的Matches集合。

(2)匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:

  • Count:匹配到的对象的数目;
  • Item:集合的又一通用方法,需要传入Index值获取指定的元素。一般,可以使用ForEach语句枚举集合中的对象。集合中对象的类型是Match。

(3)Match对象有以下几个只读的属性:

  • FirstIndex – 匹配字符串在整个字符串中的位置,值从0开始。
  • Length – 匹配字符串的长度。
  • Value – 匹配的字符串。
  • SubMatches – 集合,匹配字符串中每个分组的值。作为集合类型,有Count和Item两个属性。

(4).*?一个匹配以后,就往下进行,所以不会进行回溯,具有最小匹配的性质。

(5).*具有贪婪的性质,匹配到不能匹配为止,根据后面的正则表达式,会进行回溯。

(6)+匹配一次或多次前面的分组。

参考资料:

[1] VBA之正则表达式(1)-- 基础篇(https://blog.csdn.net/taller_2000/article/details/88088378)

[2] vba正则表达式入门(https://yshblog.com/blog/94)

[3] 正则里的(.*?)是什么意思(https://blog.csdn.net/WuLex/article/details/88563332)

[4] SubMatches Collection(https://www.vbsedit.com/html/e84ef1f4-dc6f-4d30-8b5d-dd452efec2d5.asp)

[5] excel vba regex functions(https://juejin.cn/s/excel%20vba%20regex%20functions)

[6] 简明Excel VBA(四)正则表达式(Regular Expression)(https://www.jianshu.com/p/3e0b4620bbb6)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据处理与编程实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 正则对象的属性和方法
  • 2 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档