VBA正则表达式入门与提高 下载本文

正则表达式入门与提高

一个较特殊的状况,如果上面所述的特殊变量符不是作为变量使用,而是要以它们作为字面字符的替换文本,那么就要对它们转义,方法是在它们之前加一个美元符号$.如$$&

(3)Execute方法

在目标文本中执行正则表达式搜索。 语法:set mh=object.execute(s)

其中mh是用户自定的对象变量,S是值为目标文本的字符串变量.object是正则对象.

Execute方法会作用于目标文本(S),并返回一个叫作\的集合对象,在这里是mh.在这个集合对象中包含它找到的所有叫做\的成功匹配对象(Matches集合最多可容纳65536个匹配对象). 如果未找到匹配,Execute 将返回空的 Matches 集合。Matches集合有两个只读属性:索引(Item)和成功匹配的次数(Count).

Matches集合中包含的匹配对象Match有四个只读属性:Value/firstindex/length/submatches

值得一提的是,Submatches属性是一个集合属性,集合中元素个数与正则表达式中使用的捕获性括号的个数相同,每个元素的值就是括号包围起来的内容.它也有两个只读属性:item和Count

下面用树状图来表示它们之间的关系,并在接下来的内容中继续逐一讨论它们的用法.

15

VBA平台的正则学习参考资料

<1>Matches集合的Item和Count属性

利用Matches集合的Item属性可以得到它包含的每个Match对象;利用Count属性可以得到成功匹配的个数.

Matches集合对象中元素(成功匹配)的索引编号从0开始.我们可以用遍历集合的方式或索引方法读取每一个匹配值.

例:从一段文本中提取所有英文单词.

目标文本:”苹果:iphone_5s;诺基亚:Nokia_1020” 结果要求:分别提取出iphone_5s和Nokia_1020

代码: Sub test2()

Dim reg, k, mh, strA$

strA = \苹果:iphone_5s;诺基亚:Nokia_1020\ Set reg =CreateObject(\

16

正则表达式入门与提高

reg.Pattern = \ reg.Global = True Set mh = reg.Execute(strA) For Each mhk In mh Debug.Print mhk.value Next End Sub 讨论:

通过语句Set mh = reg.Execute(strA),Execute方法返回一个集合对象mh,在这个集合对象里包含两个匹配对象,代码中用遍历方法取出每一个匹配对象的值.

Execute方法返回的集合对象mh,有两个属性:

1)Count: Execute方法成功匹配的次数,也可理解为mh集合对象中包含的成功匹配对象的个数.语法: N=mh.count 本例中n值为2

2)Item: 索引,可以通过索引值,返回集合对象中指定的匹配对象.语法: Set mhk=mh.item(0) K=mhk.value

用索引返回第一个Match对象即mhk. 本例中k为第一个Match对象的值(iphone_5s). 同样的方法可以得到第二匹配的值.

由于Item和Value属性是集合的默认属性,所以上面两个语句也可简写为: K=mh(0)......第一个匹配对象的值(iphone_5s) M=mh(1)...........第二个匹配对象的值(Nokia_1020) 上面代码中遍历集合也可以用索引法遍历: For i=0 to mh.count-1 Debug.print mh(i).value Next i

<2>Match对象的属性

Execute方法返回的集合对象中包含的也是对象元素,即match对象,match对象有四个属性: FirstIndex:匹配对象所匹配字符串的起始位置。 Length:匹配对象所匹配字符串的字符长度。 SubMatches:匹配对象所匹配结果中的子项集合。 Value:匹配对象所匹配的值。

17

VBA平台的正则学习参考资料

在本例中:索引为0,即第一个匹配对象的属性值为:

K=mh(0).value k的值为iphone_5s,value是默认属性可简写为k=mh(0)

sn=Mh(0).firsindex sn的值为3,表示在目标字符串中,位置3上找到该匹配iphone_5s.(位置是从0开始的)

Ln=mh(0).length ln值为9,即iphone_5s的字符长度 <3>Match对象的Submatches属性

匹配对象match的Submatches是一个集合属性,它包含正则表达式中用圆括号捕捉到的所有子匹配.它为用户提供了返回$1特殊变量值的方法.

集合Submatches有两个固有属性:Count和Item.可以通过Item得到集合中的每个值,它实际就是在正则表达式中用圆括号捕获的内容;Count值是集合中元素个数,实际上就是正则表达式中捕获性圆括号的个数.

下面给一个实例来说明:

目标文本:给定一个标准邮箱地址:J3721@163.com

要求:从邮箱中分别提取出:用户名j3721,服务器域名163.com 正则表达式: ^(\\w+)@(.+)$ 代码: Sub test5()

Dim reg, mh, strA$, username$, domname$ strA = \

Set reg = CreateObject(\ reg.Pattern = \ Set mh = reg.Execute(strA)

N=mh(0).submatches.count ‘n值等于2 username = mh(0).submatches(0) ‘j3721 domname = mh(0).submatches(1) ‘163.com End Sub 讨论:

正则表达式中,\\w+表示匹配@前面的所有英文单词字符;@后面的点号是一个元字符,表示匹配除换行符外的所有字符之一,后面紧跟+号,即”.+”表示匹配@后面除了换行符外的所有字符.用括号包围起来,用户名和域名就会自动分别保存在变量$1和$2中.

前面已经知道VBA不能在replace之外直接调用$1或$2,而这个例子告诉我们可以用match对象的

18