<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("vbscript.regexp")
reg.Pattern = "\w+"
reg.Global = True
Set mh = reg.Execute(strA)
For Each mhk In mh
msgbox 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:匹配对象所匹配的值。
在本例中:索引为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 = "J3721@163.com"
Set reg =
CreateObject("vbscript.regexp")
reg.Pattern = "^(\w+)@(.+)$"
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对象的submatches集合属性来提取.
在这个例子中,execute方法返回的集合对象mh中,mh中只有一个匹配对象Match,即mh(0);mh(0)对象的属性submatches(0),返回第一个括号中的内容,即j3721.而submatches(1),返回第二个括号中的内容.submathches集合也有count属性,所以如果有很多子项需要提取,也可用遍历或索引方法返回每一个特殊变量值.最后再给一例子:
下面的代码演示了如何从一个正则表达式获得一个 SubMatches 集合以及它的专有成员:
正则表达式(一个邮箱地址):
(\w+)@(\w+)\.(\w+)
如果你没有进一步了解元字符,可能不懂其中含义,不过没关系,在这里你只要知道,该代码的任务是显示电子邮箱dragon@xyzzy.com,用户名和组织名.
Function SubMatchTest(inpStr)
Dim oRe, oMatch, oMatches
Set oRe = New RegExp
' 查找一个电子邮件地址
oRe.Pattern =
“(\w+)@(\w+).(\w+)”
' 得到
Matches 集合
Set oMatches = oRe.Execute(inpStr)
' 得到
Matches 集合中的第一项
Set oMatch = oMatches(0)
' 创建结果字符串。
' Match 对象是完整匹配 — dragon@xyzzy.com
retStr = "电子邮件地址是:
" & oMatch & vbNewline
' 得到地址的子匹配部分。
retStr = retStr &
"电子邮件别名是: " & oMatch.SubMatches(0) ’ dragon
retStr = retStr & vbNewline
retStr = retStr &
"组织是: " & oMatch. SubMatches(1)
’ xyzzy
SubMatchTest = retStr
End Function
Sub SubMatchesTest()
MsgBox(SubMatchTest("请写信到 dragon@xyzzy.com 。 谢谢!"))
End Sub