VBA平台的正则学习参考资料
提供了一个称为转义元字符,即反斜杠来表示.例:表示字面点号可用”\\.”;表示反斜杠的字面字符,用”\\\\”表示.下面列举了如果匹配字面字符必须转义的元字符:
提示:
1.注意并没有包括”]”,”-“,和”}”;
2.普通字符组[?]内部,元字符的转义有自己的规则,在下一章专门介绍. 例:正则表达式: \\d\\.\\d
可以匹配0.2,3.1?.等小数.
(十)引用前面括号捕获的文本--反向引用
正则中,用形如\\1,\\2?的元字符序列表示前面捕获性括号内的字串(块),”\\1”叫反向引用.如: (abc)\\1
可以匹配目标文本:abcabc,这里\\1实际引用的是它左边括号中的内容”abc”. (abc)(defg)\\2
可以匹配目标文本:abcdefgdefg ,这里\\2指的是从左至右第二个括号中的内容. 实例:删除一段英文中重复的单词. 目标文本:This this Is is an example. 结果文本:this is an example 正则表达式: (\\w+)\\s+\\1 代码: Sub testrep() Dim reg, s$
s = \
Set reg =CreateObject(\ reg.Pattern = \ reg.Global = True reg.IgnoreCase = True s = reg.Replace(s, \
24
正则表达式入门与提高
MsgBox s End Sub 讨论:
正则表达式中,”\\w+”表示匹配连续出现的单词字符.在本例中,它会匹配至空格为止;”\\s+”匹配一个或多个空格; “\\1”它会匹配左边第一个出现的括号中的相同内容.所以,该正则会匹配诸如”1 1” “1111 1111”之类的文本.
代码中Global属性设置为True,表示搜索所有匹配;IgnoreCase属性设置为True,表示忽略大小写,如”this” 与”THIS”视为同一单词.
代码使用了正则对象的Repalce方法,用$1替换找到的匹配. 这个例中,共找到两个匹配”This this”与”Is is”;而$1在前面已经说过它保存的是第一个捕获性括号内的内容.在本例中分别是This与Is.最终通过替换实现了删除重复单词的目的.
在VBA中使用反向引用要注意:
1. 是表示八进制转义的字符还是反向引用?
细心朋友已经发现,反向引用与字符的八制转义表示法,其结构是一样的.那么怎样区分它们呢?其规则是:
“\\num”:假如num是一个可以看作八进制的数字.
如果num的值大于正则左前边捕获性括号个数,那么,它是一个八进制转义符; 如果num的值小于或等于正则左前边捕获性括号个数,那么,它是一个反向引用;
显然,如果它左前边没有捕获性括号,那么,它肯定是一个八进制转义符了.如果num数字中含有超过8,或9的数字,那么,它一定是反向引用.
2. \\1,\\2,?编号是根据前面”左半圆括号”从左至右出现的顺序确定的.
四.正则元字符----字符(串)连续出现次数表示法
上一章介绍表示字符的元字符或序列都只代表一个字符.要表示连续多个字符,正则表达式提供了下表中的元字符(序列):
25
VBA平台的正则学习参考资料
讨论:
1.这些元字符(序列)叫”量词”,它作用于它前面紧挨的字符或字符串.作用的范围:可用()标示.如果没有(),那么它只作用前面紧挨的一个字符;如果要作用它前面多个字符,必须用()标明范围.例:
3.慎用可选项量词
显然,上例中浮点数的正则不能匹配这样表示的浮点数如:”.123”.可能你已经想到用下列表达式了: \\d*(\\.\\d+)?
的确它能匹配所有形式的浮点数了.但是由于表达式中整数部分与小数部分都是可选的,这意谓着什么也不匹配,也能匹配成功.也就是说无论目标文本是空字符还是任意字符(串),正则引擎都会报告匹配成功(不过匹配结果都是空值).
4.它们都是贪婪量词,即总是尝试匹配尽可能多的字符.比如:可选项量词\它的下限是0即不匹配,上限是1. 如果有符合要求的字符(串),它则选择匹配一个字符(串),不会选择不匹配.
例:正则表达式 .*
26
正则表达式入门与提高
它总是匹配一行中换行符前所有的文本. 实例:提取科室名 目标文本:
姓名:张三 科室:人事科(科长) 姓名:李四 科室:保卫科(干事) 正则表达式: 科室:(.*) 代码: Sub testname() Dim reg, mh, s$
s = \姓名:张三 科室:人事科(科长)\姓名:李四 科室:保卫科(干事)\ Set reg =CreateObject(\ reg.Pattern = \科室:(.*)\ reg.Global = True Set mh = reg.Execute(s) MsgBox mh(0).SubMatches(0) MsgBox mh(1).SubMatches(0) End Sub 讨论:
当用\科室:(.*)\去匹配文本时,在第一行成功匹配到:\科室:\后,正则的(.*)部分将依次匹配到后面跟着的所有字符,直到英文句点不能匹配的换行符.所以括号捕获到的内容是:人事科(科长).
而Global属性设置为true,表示找到第一个匹配后,只要还有文本没有尝试,那么,它将继续找出其它所有匹配结果. 在这个例子,找到两个匹配分别为mh(0)和mh(1). 其科室名即括号捕获的内容分别保存在这两个匹配的特殊变量$1中,VBA可以利用Match对象的submatches属性提取它们.(提示:如果不明白代码意思,请回到第一篇第二章查阅)
五.正则元字符—-字符(串)位置表示法
正则提供了一些表示位置元字符(序列),它可以锚定特定字符(串),有时使用它们可以提高匹配效率.除了前面介绍的^和$外,还有:
27
VBA平台的正则学习参考资料
(一)单词分界符\\b
在英文环境中,匹配一个字边界,即字与空格间的位置。例如,“er\\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。
它匹配这样一个位置:该位置一边是英文单词字符,另一边不是.也可以理解为该位置两边的字符,其中一个可以被\\w匹配,另一个字符则可被\\W匹配.所以在英文环境中,可匹配四种位置 (本文中英文单词字符指[a-zA-Z0-9_]):
1) 在字符串的第一个字符前的位置(如果字符串的第一个字符是一个“单词字符”) 2) 在字符串的最后一个字符后的位置(如果字符串的最后一个字符是一个“单词字符”) 3) 在一个“单词字符”和“非单词字符”之间,其中“非单词字符”紧跟在“单词字符”之后 4) 在一个“非单词字符”和“单词字符”之间,其中“单词字符”紧跟在“非单词字符”后面 下面这个例子可让你明白单词分界符的用途: 目标文本:He captured a catfish for his cat 正则表达式1: cat
正则表达式2: \\bcat\\b
任务要求:用字符串fat,替换文本中的cat. 代码: sub test() dim s$
with createobject(\ .pattern=\分别用上面两个表达式测试 .global=true
s=.replace(\
28