VBA正则表达式入门与提高(6)

2019-07-13 17:32

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


VBA正则表达式入门与提高(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:叉车司机复习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: