Excel VBA 编程 -- 高阶文字处理(五)
前面讨论了“赋能”字符,今天来讨论模式中的元字符。所谓元字符(meta character),是指在模式字符串中被赋予特殊意义的字符。VBA 模式字符串中的元字符列表如下:第二个模式字符串,"(z|w)ood?",利用了选择元字符(|)和量化元字符(?),这样可以在一个模式字符串中指定多个匹配,如例中所示,这个模式既可以匹配 zoo,也可以匹配 wood。如果将模式字符串写成 "([zZ]|[wW])ood?",就可以匹配 zoo、Zoo、wood、Wood 四种情况。第四个模式字符串,"\b\d+$",指定要匹配的数字串的特征:以单词边界开始,到行末结束,也就是说,要匹配的数字串必须是文本中最后一个单独的数字串。在我们给出的文本中,最后的数字串 50 后面有一个句号(.),不满足模式的要求,因此没有完成匹配,所以匹配个数是 0。最后的模式字符串,"^(\d+)\b.*\b(\d+)[\b|,|\.]$",是一个比较复杂的模式。在这个模式中,指定了两个分组,分别是位于行首的 (\d+),以及位于行末的 (\d+)。为了避免上面模式的错误,为行末的数字串增加了结束符,可以是空格(由 \b 表示),也可以是逗号(,),还可以是句号(由 \. 表示,因为 . 是元字符,因此需要前缀以反斜杠 \ 对元字符进行脱敏)。这样指定以后,就可以将文本的行首和行末的两个数字串识别出来。\b、\d 等这些经过反斜杠 \ 赋能的元字符,我们在前文已经讨论过,请参阅文末的《高阶文字处理(三)》。在这个例子中,第一个模式,"[1-9]0{2,}",表示匹配数字串,数字串的特征是:以 1 到 9 的数字开头,后面跟有 2 个以上的 0。所以,这个模式匹配文本中的 300,但不匹配 120。我们可以用模式匹配来计算文本中某个或某些字母的出现次数。第二个模式,"[Oo]",表示匹配文本中的字母 O 或 o,也就是说,用来统计文本中字母 o(不分大小写)的出现次数。第三个模式,"[Oo]{2, }",使用了两种构造,先是用方括号 [] 来定义字符类,"[Oo]" 表示仅匹配大写或小写的字母 o。然后用大括号 {} 来对字符类的出现进行量化,"{2, }" 表示 [] 定义的字符类可以出现 2 次以上。所以,模式 "[Oo]{2, }" 匹配 “Oo"、"OOO"、"ooooo" 等等。第四个模式,"([a-zA-Z])\1",使用了三种构造,先是用小括号 () 进行分组,然后对分组内容使用 [] 定义字符类,最后使用 \1 表示重复前面的分组。- "([a-zA-Z])":定义这样一个分组,分组的内容匹配单个的大写或小写的字母。
- "\1":表示此处重复前面的分组,前面匹配什么字母,这里也匹配什么字母。
所以,这个模式 ”([a-zA-Z])\1" 要匹配的是任意两个重复的字母,譬如 aa、AA、ss、oo 等等。但这个模式只能找出任意两个重复出现的字母,不能找出这两个字母所在的字。第五个模式解决了这个问题:"\w*([a-zA-Z])\1\w*",这个模式定义了任意两个重复出现的字母可以出现在一个字的开头、中间、结尾,不管出现在哪里,都能够把所在的字找出来。正如输出所显示的,ll 出现在 shall 中,oo 出现在 too 中。