乐于分享
好东西不私藏

Excel VBA 编程 -- 高阶文字处理(三)

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