VBA正则表达式入门与提高 联系客服

发布时间 : 星期四 文章VBA正则表达式入门与提高更新完毕开始阅读

正则表达式入门与提高

(七)ASCII码表中字符的十六进制转义表示法: \\xnum

一个小写的\\X后跟两个大写十六进制数字可以匹配ASCII字符集中的一个字符.

提示:可匹配范围\\x00--\\xFF,但一般用\\x00--\\x7F表示ASCII字符集中的前128个字符.\\x80-\\xFF(ASCII扩展码表字符),一般用Unicode代码点表示法替代.

(八)Unicode码表中字符的十六进制转义表示法:\%unum

Unicode码一般用称之为代码点来表示一个字符.它是一个十六进制数.

正则表达式中,用“\%u”序列后面紧跟字符unicode代码点(十六进制数)表示该字符. 例:

提示:

1.\%unum表示法可表示代码点在U+0000--U+FFFF范围内的unicode字符.Unicode本身在发展中,已经出现超过4位的代码点,VBscript正则是不支持,但它们是很难遇到的字符.

2.用字符组[?]表示Unicode字符范围时,也可直接用表中起点字面字符与终点字面字符表示.比如大陆中文字符在Unicode表中,起始代码点是U+4e00,是表示中文字符”一”,终点代码点U+9fff,该代码点未定义,而”龥”字在终点附近,所以我们也可以用”[一-龥]”表示所有中文字之一.顺便提示一点,汉字在Unicode中的分布,基本无规律.不要想像\一\后面就是\二\等等.

3.有些流派的正则可以用Unicode的属性来方便表示不同类别的汉字或其它语言文字,但VBscript 5.5是不支持的.

(九)元字符字面字符表示法:转义符”\\”

正则表达式用了一部分字符作为元字符,那么怎样在正则表达式中表示这些元字符的字面字符呢?它

23

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