Excel VBA 编程 -- 高阶文字处理(六)
前面我们讲过,VBA 模式字符串中,大括号 {} 是量化符号,其一般格式是:其中,如果 n 后面的逗号 , 和 m 都没有,则 { n } 表示精确匹配 n 次。如果仅 m 没有,则 { n, } 表示匹配大于等于 n 次。如果 n 和 m 都有,则 { n, m } 表示匹配 n 到 m 次。第二个模式,"\d{2,}",匹配 2 位以上的数字。第三个模式,"\w{4, 5}",匹配长度为 4 和 5 的单词或数字,如图所显示的,这个模式匹配 “Today”,因为这个单词长度为 5,也匹配 "2026",因为这个数字串长度为 4。注意:上面的模式中,"\d" 仅匹配数字,”\w“ 匹配字母、数字、下划线。元字符 ?,*,+ 也是量化符号,它们分别匹配 0 到 1 次,0 到多次,1 到多次,可以用 {n, m} 表示如下:在这个例子中,模式 "\b[A-Z]+[a-z]+" 和 "\b[A-Z]{1,}[a-z]+" 是等价的,因为量化符号 "+" 与 "{1, }" 等价。只有第三个模式才能精确匹配大写字母开头的单词:"\b" 表示匹配单词边界,"[A-Z]{1}" 表示精确匹配 1 个大写字母,"[a-z]{1,}" 表示匹配多个小写字母,合起来就表示精确匹配 "Hello" 这个字,而不匹配 "Aha" 这个字,因为 "A" 并非位于单词边界上,"A" 的前面有字母 "H"。- 不需要精确匹配次数的量化符号,可以称之为不定次数的量化符号,这些量化符号有 ?, *, +
- 需要精确匹配次数的量化符号,可以称之为确定次数的量化符号,这些量化符号是 {n, m}
RegExp 对象还有一个方法我们还没讨论,那就是 Replace。Replace 方法用目标字符串替换在源文本中匹配的字符串。一般格式为:RegExp.Replace(sourceString As String, replaceVar) As String其中,sourceString 是源文本,replaceVar 是目标字符串,返回替换后的文本。我们前面讨论过 VBA 的 Replace 函数,但这里的 RegExp.Replace 方法功能要强大得多。下面通过例子来说明。RegExp.Replace 方法可以用来对数据进行清洗。譬如,我们需要的数据格式为 name=value(名字=值),但收到的数据往往会在等号前后加入多个空白。我们需要将数据整理成 name=value 格式。此时仅仅使用 VBA 的 Replace 方法就很难奏效了,因为 name 中有可能包含空格,value 中也有可能包含空格,单纯用 Replace(data, " ", "") 来清洗,会将 name/value 中正常的空格也给清洗掉。这个时候,就应该 RegExp.Replace 大显身手了。如例子所示,我们首先定义模式:"(\w+)(\s+)=(\s+)(\w+)"。小括号元字符的作用是定义分组,这个模式定义了 4 个分组,其中,name 用第一个分组 "(\w+)" 表示,value 用第四个分组 "(\w+)" 表示,等号 "=" 作为字符字面量,精确匹配文本中的等号,等号两边的 "(\s+)" 则代表 1 个或多个空白字符。有了模式,怎么样将需要的内容提取出来,丢掉不需要的内容呢?这就是 Replace 方法的功能。例中使用 re.Replace(data, "$1=$4") 来完成删掉多余空白字符的任务。我们在模式中定义了四个分组,然后在 Replace 方法的目标字符串 replaceVar 参数部分使用 $n 来引用模式中的分组:$1 指第一个分组,即 name 部分,$4 指第四个分组,即 value 部分,所以,"$1=$4" 就表示name=value。替换的结果就是去掉了等号左右多余的空白字符。注:在这个例子中,因为是多行文本,所以需要将 RegExp 对象的 Global 和 Multiline 属性设置为 True。