Excel VBA 编程 -- 高阶文字处理(二)
前文我们简单介绍了一下 VBA 中的正则表达式的基本概念,今天来讨论 VBA 中处理正则表达式的核心对象——RegExp。RegExp 对象原来是 VBScript 中的对象,要使用 RegExp,必须首先引入正则表达式处理引擎 Microsoft VBScript Regular Expression 5.5,或者使用 CreateObject("VBScript.RegExp") 来启动处理引擎。现在因为微软已经决定舍弃 VAScript,因此就把 RegExp 从 VBScript 中移到了 VBA 中。在使用最新版本的 VBA 编程时,已经不再需要引入 Microsoft VBScript Regular Expression 5.5,RegExp 已经内置在 VBA 中。如下图所示:由图中可以看出,RegExp 对象很简单,只有四个属性和三个方法,分别列于下面的表中。RegExp.Execute 方法返回匹配结果,这是一个 MatchCollection 集合对象,该对象由零个或多个 Match 对象组成。其中,SubMatches 属性是一个 SubMatches 类型的集合对象,但这个集合对象是由字符串组成的。这个例子演示了 RegExp、Match、SubMatches 诸对象的用法。让我们仔细看一下。首先看模式字符串:(\w+)\s*(\[(\w+)\])?- (\w+):这是第一个分组,加号 + 是一个量化符号,表示 1 次或多次,因此,\w+ 表示由 1 个或多个大小写字母、数字以及下划线组成的字。
- \s*:\s 表示空白字符,星号 * 是一个量化符号,表示 0 次或多次,因此,\s* 表示 0 个或多个空白字符。
- (\[(\w+)\])?:这是第二个分组,这个分组又内嵌了第三个分组:
- ()?:这个最外层的结构,表示这个分组可以出现,也可以不出现。问号 ? 是一个量化符号,表示 0 次或 1 次。
- \[(\w+)\]:方括号 [] 本来是模式中的元字符,经过转义之后,变成了字符字面量(关于字符字面量,请参见前一篇文章)。因此,\[\] 精确匹配文本中的 []。
- (\w+):这是内嵌在第二个分组中的第三个分组,表示一个字。
综合起来,这个模式将匹配这样的文本:一个字,或者一个字后跟 1 个或多个空格(空白字符),或者一个字,后跟空白字符,后跟一个由方括号括起的字。例子中给出的文本是:Test[bar]。对于这个文本,RegExp.Execute 执行的结果,将返回只含有一个 Match 对象的 MatchCollection 集合。这个集合中的 Match 对象将含有一个由三个元素组成的 SubMatches 集合对象:- SubMatches(0):含有第一个分组的字符串“Test”。
- SubMatches(1):含有第二个分组的字符串"[bar]"。
- SubMatches(2):含有第三个分组的字符串"bar"。
为了更好地理解各个对象的类型,例中给出了用 TypeName 和 VarType 函数得到的类型。VarType 9 表示 vbObject,说明这是一个由 Variant 包裹的对象类型,VarType 8 表示 vbString,说明这是一个由 VariAnt 包裹的字符串类型。仔细查看示例的输出结果,发现 Match 的 TypeName 是 Match,但 VarType 却是 vbString(8)。那是因为 Match 对象的默认属性 Value 是 vbString 类型的缘故。