|
楼主 |
发表于 2014-6-11 09:31
|
显示全部楼层
本帖最后由 liu-aguang 于 2014-6-12 08:43 编辑
<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
|
评分
-
7
查看全部评分
-
|