打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
正则的VBA实现

前面研究了正则的基本概念之后,接下来要做的事情就是在VBA中把他实现了。

遗憾的是,VB中并没有内置处理正则的库。所以我们要使用引用外部库的方式(与引用字典以及FSO的库类似),先添加VBScript引用。

在任何一个新的库开始之前,我们都要先了解他的对象体系。在引用完正则之后,首先按F2查看对象型。  

在这里从网上盗图一张,来大概看一下这个对象体系:

整体来说,这个对象体系比较简单,我们需要了解3个核心对象以及他的属性和方法。

RegExp对象

这个可以看做是VBA中正则的核心引擎。
我们先用代码来实例化一个RegExp对象,在这里使用前期(注意不是前妻)绑定:

Dim Re As VBScript_RegExp_55.RegExpSet Re = New VBScript_RegExp_55.RegExp

这个核心引擎对象的属性加方法一共只有7个,我们下面用一个实例来理解RegExp的关键属性和方法:

Pattern属性

这个Pattern属性,就是我们之前讨论的匹配模式

Dim sPattern As StringsPattern = '\d{4}年\d{1,2}月\d{1,2}日'Re.Pattern = sPattern

Test方法

Test方法是对给定的字符串进行测试,看是否包含RegExp对象的Pattern。

Dim Str As StringStr = '2018年1月1日'Debug.Print Re.Test(Str)

返回:

True

Global属性

Global属性是一个布尔值,用来设置全局查找。
如果设置为True,代表查找字符串中所有对Pattern的匹配。如果设置为False,那么就代表只查找出现的第一个匹配。

承接上面的代码,我们先把Global设置为True

Re.Global = True

Execute方法

对字符串进行Pattern匹配,所得到的返回值为MatchCollection。

所谓的MatchCollection,其实就是Match对象的集合。为了理解这个概念,可以把Match之于MatchCollection与Worksheet之于Worksheets来作比较。

Dim Str2 As StringStr2 = '2018年1月1日, 2018年1月2日'Dim mhc As VBScript_RegExp_55.MatchCollectionSet mhc = Re.Execute(Str2)Debug.Print mhc.Count

MatchCollection有两个属性,一个是count,表示有匹配集合中有几个匹配。
上面的打印结果返回2,代表有两个匹配。

另外一个属性是索引item。使用所以可以对单个匹配进行引用。例如,如果要获得上述匹配的内容,可以这么来写:

Dim i As IntegerFor i = 0 To mhc.Count - 1    Debug.Print mhc.Item(i).ValueNext i

返回:

2018年1月1日2018年1月2日

在实际使用中,mhc.item(0)可以缩写为mhc(0)
MatchCollection集合的索引值从0开始

Match对象

Match包含了对字符串按照指定Pattern所得到的匹配。Match对象比较重要的属性有两个:value以及submatches  

value

使用Match.value方法可以获得Match的值。

Submatches

既然一个Match对象已经是对字符串的匹配,那么什么是Submatch呢?
举例来说,对于一个字符串匹配的Pattern:\d{4}年\d{1,2}月\d{1,2}日,可以匹配日期2018年1月1日,但我们如果只想获得年数2018应该怎么处理呢?

如果要获取匹配出来的字符串的某一部分,就需要用括号来进行捕获了。括号捕获出来的内容,会被存放在Submatches集合里面。
上面的匹配可以改成:(\d{4})年\d{1,2}月\d{1,2}日

我们可以使用下面的方法来打印捕获括号内的内容。

Dim sPatternNew As StringsPatternNew = '(\d{4})年\d{1,2}月\d{1,2}日'Re.Pattern = sPatternNewSet mhc = Re.Execute(Str2)Debug.Print mhc.CountDim mh As VBScript_RegExp_55.MatchFor i = 0 To mhc.Count - 1    Set mh = mhc(i)    Debug.Print 'Count of Submatches: ', mh.SubMatches.Count    Debug.Print mh.SubMatches(0)Next i

返回:

2 Count of Submatches:     1 2018Count of Submatches:     1 2018

基本上,熟悉了RegExp,  Match,以及SubMatch对象之后,就可以用正则做一些基本的匹配,文字处理的小脚本了。  不过从整体上来看,VBA的正则仍然比较弱,如果想用正则做一些高级功能,比如捕获内容然后赋值给变量,或是对匹配直接进行函数运算,还是需要高级语言来实现。

总结一下

  • 正则的VBA实现

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VB6.0如何使用正则表达式
VBA正则表达式入门与提高
VBScript-RegExp对象的详细用法
VBA中的正则表达式(三)
JavaScript RegExp 对象参考手册
正则表达式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服