正则表达式入门与提高
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 = \ ' 得到 Matches 集合
Set oMatches = oRe.Execute(inpStr) ' 得到 Matches 集合中的第一项 Set oMatch = oMatches(0) ' 创建结果字符串。
' Match 对象是完整匹配 — dragon@xyzzy.com retStr = \电子邮件地址是: \ ' 得到地址的子匹配部分。
retStr = retStr & \电子邮件别名是: \ retStr = retStr & vbNewline
retStr = retStr & \组织是: \ SubMatchTest = retStr End Function Sub SubMatchesTest()
MsgBox(SubMatchTest(\请写信到 dragon@xyzzy.com 。 谢谢!\End Sub
19
VBA平台的正则学习参考资料
(前面第一篇的第一/二部分,概要阐述了正则表达式的基本思想,并对正则在VBA中的实现(也就是Regexp对象操作)作了详细讲解.接下来的第二至第六部分我们将集中介绍VBA中(本质上是Regexp对象中)可使用的全部元字符(序列),有的称为元字符的\特性\有的叫作正则\语法\反正它的基本属性就是用来描述字符的特殊字符.)
三.正则元字符----字符表示法
人类自然语言所用字符极其丰富多样,我们已经知道正则表达式是用元字符及它们的组合来描述这些字符以及这些字符组成的特定结构的.需要指出的是,正则没有统一标准,它是分流派的.在不同语言平台上(或同语言平台而版本不同),正则元字符的多少往往不同,同一元字符的特性也可能存在一定的差异.正是这个原因,在你参考各种正则资料的时候,尤其要注意这个问题.前面已经阐明,目前VBA平台上,用的是VBScript提供的正则对象,执行的是ECMA-262所规定的标准.
VBscript提供的元字符可方便地描述ASCII码表中的字符集.ASCII码表基本上包括了英文语系所用的所有字符.(如果你不熟悉,可以上网查查,大体上了解有哪些字符).也支持代码点不超过四位十六进制数的Unicode表的字符集.这解决了包括汉字在内的世界各国的官方文字的表示问题.为方便用户在不同环境下使用,同一字符往往有多种等价表示方法.
下面是对表示字符的元字符及序列的分类介绍:
(一)对于一些常用的不可打印字符,规定了专用的元字符序列
用正则表达式来描述一段字符串,即使它是看不见的,也必须毫无遗漏地表示出来.比如,空格,空白字符和一些不可打印字符,所以,在元字符(序列)中都有它们的表示方法.
20
正则表达式入门与提高
(二)普通字符组:肯定字符组[a-z]及否定字符组[^a-z]
肯定字符组表示方括号内列出的任意一个字符.否定字符组是在左方括号后紧跟着一个脱字符”^”,表示匹配括号内未列出的任一字符.例:
讨论:
1.如果字符范围在ASCII码表或Unicode字符表中是连续分布的,可以只用起止字符表示范围,中间用”-“连接.
2.用”-“连接的字符范围,前面必须是起点字符,如不能把[a-z]写为[z-a] 3.字符组内的字符顺序无关紧要,如[^ieou]与[^eiuo]是一个意思. 4.如果”-“字符中最左或最右位置,它表示匹配字面字符”-“.如[ieou-] 5.如果”^”没有紧跟在”[“之后,它也只表示字面字符”^”.
(三)字符组缩略表示法
对于一些常用的字符类,正则提供了简略表示法:
21
VBA平台的正则学习参考资料
提示:肯定类字符缩略表示法,只能表示ASCII码表中的字符,而该表中的否定元字符序列,它们可以匹配文本中unicode字符.
实例:
正则表达式 \\W\\W\\s\\w\\w\\w
它表示匹配一个非单词字符,紧跟又是一个非单词字符,再是一个空格,最后连续三个单词字符.可以匹配:”正则 ABC”,”规则 1_3”等.
(四)几乎能匹配任何字符的元字符:英文句点
英文点号”.”可以匹配除换行符(\\n)外的任意字符之一.它不限于ASCII码表中的字符,只要能显示于电脑上的字符都能匹配.在VBA中,英文句点等价于[^\\n].
(五)控制字符表示法:\\cChar
在ASCII码表中,十进制代码为1-26的字符全是控制字符,可以用”\\c”连接字母A-Z之一来表示. 即\\cA-\\cZ分别表示代码为1-26的控制字符.如”\\cM”,表示回车符.
(六)ASCII码表中字符的八进制转义表示法:\\num
VBscript正则可用字符的八进制编码转义来表示ASCII字符:它的序列由反斜线和字符的八进制编码组成.例:
提示:八进制转义法表示字符范围:\\0--\\377,包括ASCII码表和扩展表中的256个字符.该表示法主要用于难以输入的字符.
22