当前位置:文档之家› excelvba正则表达式从实例开始

excelvba正则表达式从实例开始

'EXCEL VBA 正则表达式从实例开始所有代码都测试过'''[2011-09-09:'[2010-08-08:'数据验证经常出现的情况是,需要验证和处理大量的文本内容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。

'1.正则表达式(Regular Expression)基础' 正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。

正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:'tutorials/regex/'''中的正则表达式应用' 在VBA中使用正则表达式,可以通过下列途径实现:'创建正则表达式对象:'前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 类库,然后直接定义对象:Dim reg As New RegExp。

'后期绑定:使用CreateObject方法定义对象:CreateObject("")。

'前一种方式的优点是可以有编辑器的Intellisense支持'RegExp对象的属性:'Global - 设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。

如果搜索应用于整个字符串,Global 属性的值应该为 True,否则其值为False。

默认的设置为True。

'Multiline - 返回正则表达式是否具有标志m, 缺省值为False。

如果指定的搜索字符串分布在多行,这个属性是要设置为True的。

'IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是否区分大小写。

如果搜索是区分大小写的,则 IgnoreCase 属性应该为False;否则应该设为True。

缺省值为True。

'Pattern - 设置或返回被搜索的正则表达式模式。

被搜索的正则字符串表达式。

它包含各种正则表达式字符。

'RegExp对象的方法:'Execute - 对指定的字符串执行正则表达式搜索。

需要传入要在其上执行正则表达式的文本字符串。

正则表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。

Execute 方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。

如果未找到匹配,Execute将返回空的Matches集合。

'Replace -替换在正则表达式查找中找到的文本'Test - 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。

属性对Test方法没有影响。

如果找到了匹配的模式,Test方法返回True;否则返回False。

'MatchCollection对象与Match对象'匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:'Count: 匹配到的对象的数目'Item:集合的又一通用方法,需要传入Index值获取指定的元素。

'一般,可以使用For Each语句枚举集合中的对象。

集合中对象的类型是Match。

'Match对象有以下几个只读的属性:'FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。

'Length -匹配字符串的长度'Value -匹配的字符串'SubMatches - 集合,匹配字符串中每个分组的值。

作为集合类型,有Count和Item两个属性。

''常用的正则表达式主要有以下几种:'匹配中文字符的正则表达式: [\u4e00-\u9fa5]'评注:匹配中文还真是个头疼的事,有了这个表达式就好办了'匹配双字节字符 (包括汉字在内): [^\x00-\xff]'评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)'匹配空白行的正则表达式:\n\s*\r'评注: 可以用来删除空白行'匹配HTML标记的正则表达式:<(\S*)[^>]*>.*</>|<.* />'评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力'匹配首尾空白字符的正则表达式:^\s*|\s*$'评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式'匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*'评注: 表单验证时很实用'匹配网址URL的正则表达式:[a-zA-z]+:d+\.\d+\.\d+'评注: 提取ip地址时有用'匹配特定数字:'^[1-9]\d*$ d*|0\.\d*[1-9]\d*$ d*|0\.\d*[1-9]\d*)$ d*|0\.\d*[1-9]\d*|0\.0+|0 )$ d*|0\.\d*[1-9]\d*|0\.0+|0$ d*|0\.\d*[1-9]\d*))|0\.0+|0$ '\w 匹配字母或数字或下划线或汉字'\s 匹配任意的空白符'\d 匹配数字'\b 匹配单词的开始或结束'^ 匹配字符串的开始'$ 匹配字符串的结束''表2.常用的限定符'代码/语法说明'* 重复零次或更多次' 重复一次或更多次 +'Print 重复零次或一次'{n} 重复n次'{n,} 重复n次或更多次'{n,m} 重复n到m次''表3.常用的反义代码'代码/语法说明'\W 匹配任意不是字母,数字,下划线,汉字的字符'\S 匹配任意不是空白符的字符'\D 匹配任意非数字的字符'\B 匹配不是单词开头或结束的位置'[^x] 匹配除了x以外的任意字符'[^aeiou] 匹配除了aeiou这几个字母以外的任意字符''表4.常用分组语法'代码/语法说明分类'(exp) 匹配exp,并捕获文本到自动命名的组里捕获'(<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成('name'exp)'(:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号'(=exp) 匹配exp前面的位置零宽断言'(<=exp) 匹配exp后面的位置'(!exp) 匹配后面跟的不是exp的位置'(<!exp) 匹配前面不是exp的位置'(#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读注释''表5.懒惰限定符'代码/语法说明'* 重复任意次,但尽可能少重复'+ 重复1次或更多次,但尽可能少重复' 重复0次或1次,但尽可能少重复'{n,m} 重复n到m次,但尽可能少重复'{n,} 重复n次以上,但尽可能少重复''表6.常用的处理选项'名称说明'IgnoreCase(忽略大小写) 匹配时不区分大小写。

'Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。

(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)'Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。

'IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。

'ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

''表7.尚未详细讨论的语法'代码/语法说明'\a 报警字符(打印它的效果是电脑嘀一声)'\b 通常是单词分界位置,但如果在字符类里使用代表退格'\t 制表符,Tab'\r 回车'\v 竖向制表符'\f 换页符'\n 换行符'\e Escape'\0nn ASCII代码中八进制代码为nn的字符'\xnn ASCII代码中十六进制代码为nn的字符'\unnnn Unicode代码中十六进制代码为nnnn的字符'\cN ASCII控制字符。

比如\cC代表Ctrl+C'\A 字符串开头(类似^,但不受处理多行选项的影响)'\Z 字符串结尾或行尾(不受处理多行选项的影响)'\z 字符串结尾(类似$,但不受处理多行选项的影响)'\G 当前搜索的开头'\p{name} Unicode中命名为name的字符类,例如\p{IsGreek}'(>exp) 贪婪子表达式'(<x>-<y>exp) 平衡组'(im-nsx:exp) 在子表达式exp中改变处理选项'(im-nsx) 为表达式后面的部分改变处理选项'((exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no'((exp)yes) 同上,只是使用空表达式作为no'((name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no '((name)yes) 同上,只是使用空表达式作为no''在VBA中使用正则表达式,可以通过下列途径实现:'创建正则表达式对象:'前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用Microsoft VBScript Regular Expressions 类库,然后直接定义对象:Dim reg As New RegExp。

相关主题