Excel VBA 编程 -- 高阶文字处理(三)
我们已经了解了 RegExp 及相关对象,可以看出,这些对象并不复杂。使用正则表达式作模式匹配的真正难点是如何写出正确的模式。模式字符串中包括了字符字面量(character literals)和元字符(meta characters),譬如,在模式字符串 "^Hi, Bob$" 中,Hi, Bob 是字符字面量,而 ^ 和 $ 都是元字符。所谓元字符(meta characters),就是在字符串中有特殊意义的字符,这个特殊意义是人为赋予它的,与它的字面意义没有关系。譬如,^(脱字符)是一个多用途控制字符,在不同的系统中有不同的意义。在模式字符串中有两种意义:- 在方括号 [] 内使用时,^ 表示“取反”。如 "[^0-9]" 表示匹配非数字字符。
- 不在方括号内使用时,^ 表示文本的开头。如 "^Hi" 表示匹配位于文本开头的字符串 "Hi"。
$ 符号也是元字符,用来表示文本的末尾。所以,模式字符串 "^.*$" 表示一整行:^ 匹配头,$ 匹配尾,点号 . 是用来匹配任何字符的元字符,星号 * 则是表示量化的元字符,与点号结合起来 ".*",就表示 0 个或多个任何字符。这些元字符要想作为字符字面量(普通字符)起作用,需要使用反斜杠 \ 对其进行转义,"\^Hi" 将匹配前面带有一个脱字符 ^ 的 Hi 字符串,"Hi\$" 将匹配后面跟一个美元符号 $ 的 Hi 字符串。而 "^Hi$" 将匹配一行只有 Hi 字符串的文本。下面来看一个例子。这个例子演示了上面所讨论的元字符的用法。上面例子中的 ^、$、.、* 等等都是元字符,这些元字符要想作为普通字符(即字符字面量)使用,必须使用反斜杠 \ 对其进行转义(也可以看作是“脱敏”,即脱去其特殊意义)。事情还有另外一面。某些普通字符可以通过转义成为具有特殊意义的元字符,譬如,n 本来是一个普通的小写字母字符,通过反斜杠进行转义后,\n 就成为了元字符,用来表示换行符。这种作用可以看作是“赋能”——对普通字符赋予特殊能力。首先,从这个例子可以看出,\n 字符在 VBA 字符串中不起作用,必须用 Chr(10) 来代替,也就是说,在 VBA 中,Chr(10) 才是换行符。其次,换行符起到了另起一新行的作用,所以必须将 RegExp 对象的 Multiline 属性设置为 True,使其处于多行文本状态下,才能对其中由换行符分隔的多行文本进行模式匹配。就本例第二段的最后一行来说,前面的换行符使得最后的 "Hi, Bob." 文本位于单独一行,因而与模式的要求一致,从而匹配成功。最后一段演示的是,VBA 字符串中要嵌入换行符,必须使用 Chr(10),但正则表达式中要匹配换行符的话,还得使用 \n。这是 VBA 语言不一致的又一个例子。下图表示的是一个用 C# 写的类似的例子,可以看出,C# 字符串中的 \n 是起作用的。