1、EXCEL VBA 正那么表达式 从实例开始EXCEL VBA 正那么表达式 从实例开始所有代码都测试过2020-09-09:2020-08-08:数据验证常常显现的情形是,需要验证和处置大量的文本内容,有时候需要查找字符串,有时候要按条件替换,而且这些待处置的问题仍是有必然的规律可循的,可是无法通过列举的方式挨个验证,那个时候就需要正那么表达式来帮忙。1.正那么表达式(Regular Expression)基础正那么表达式是通用的文本搜索和处置方案,它的知识不是VBA特有的,大体上每种语言都内置了正那么表达式的功能。正那么表达式的基础知识不是那个地址的重点,需要的朋友能够Google一下,或
2、参看下面的一些入门教程:tutorials/regex/中的正那么表达式应用在VBA中利用正那么表达式,能够通过以下途径实现:创建正那么表达式对象:前期绑定:在VBA代码编辑器中的Tools菜单中,选中References.,然后引用Microsoft VBScript Regular Expressions 类库,然后直接概念对象:Dim reg As New RegExp。后期绑定:利用CreateObject方式概念对象:CreateObject()。前一种方式的优势是能够有编辑器的Intellisense支持?RegExp对象的属性:Global - 设置或返回一个 Boolean 值
3、,该值指明在整个搜索字符串时模式是全数匹配仍是只匹配第一个。假设是搜索应用于整个字符串,Global 属性的值应该为 True,不然其值为 False。默许的设置为True。Multiline - 返回正那么表达式是不是具有标志m, 缺省值为False。假设是指定的搜索字符串散布在多行,那个属性是要设置为True的。IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是不是区分大小写。假设是搜索是区分大小写的,那么 IgnoreCase 属性应该为False;不然应该设为True。缺省值为True。Pattern - 设置或返回被搜索的正那么表达式模式。 被搜索的正那么字符串
4、表达式。它包括各类正那么表达式字符。RegExp对象的方式:Execute - 对指定的字符串执行正那么表达式搜索。需要传入要在其上执行正那么表达式的文本字符串。正那么表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方式返回一个Matches集合,其中包括了在string中找到的每一个匹配的Match对 象。假设是未找到匹配,Execute将返回空的Matches集合。Replace -替换在正那么表达式查找中找到的文本?Test - 对指定的字符串执行一个正那么表达式搜索,并返回一个 Boolean 值指示是不是找到匹配的模式。属性对Test方式没有阻碍。
5、假设是找到了匹配的模式,Test方式返回True;不然返回False。MatchCollection对象与Match对象匹配到的所有对象放在MatchCollection集合中,那个集合对象只有两个只读属性:Count: 匹配到的对象的数量Item:集合的又一通用方式,需要传入Index值获取指定的元素。一样,能够利用For Each语句列举集合中的对象。集合中对象的类型是Match。Match对象有以下几个只读的属性:FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。Length -匹配字符串的长度?Value -匹配的字符串?SubMatches - 集合,匹配字符串中
6、每一个分组的值。作为集合类型,有Count和Item两个属性。常常利用的正那么表达式要紧有以下几种:匹配中文字符的正那么表达式: u4e00-u9fa5评注:匹配中文还真是个头疼的事,有了那个表达式就好办了匹配双字节字符 (包括汉字在内): x00-xff评注:能够用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正那么表达式:ns*r评注: 能够用来删除空白行匹配HTML标记的正那么表达式:*.*?|评注:网上流传的版本太糟糕,上面那个也仅仅能匹配部份,关于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正那么表达式:s*|s*$评注:能够用来删除行首行尾的空白字符(
7、包括空格、制表符、换页符等等),超级有效的表达式匹配Email地址的正那么表达式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)*评注: 表单验证时很有效匹配网址URL的正那么表达式:a-zA-z+:d+.d+.d+评注: 提取ip地址时有效匹配特定数字:1-9d*$d*|0.d*1-9d*$d*|0.d*1-9d*)$d*|0.d*1-9d*|0?.0+|0)$d*|0.d*1-9d*|0?.0+|0$d*|0.d*1-9d*)|0?.0+|0$w 匹配字母或数字或下划线或汉字s 匹配任意的空白符d 匹配数字b 匹配单词的开始或终止 匹配字符串的开始$ 匹配字符串的终止表2.常常利
8、用的限定符代码/语法 说明* 重复零次或更多次 重复一次或更多次 +Print 重复零次或一次n 重复n次n, 重复n次或更多次n,m 重复n到m次表3.常常利用的反义代码代码/语法 说明W 匹配任意不是字母,数字,下划线,汉字的字符S 匹配任意不是空白符的字符D 匹配任意非数字的字符B 匹配不是单词开头或终止的位置x 匹配除x之外的任意字符aeiou 匹配除aeiou这几个字母之外的任意字符表4.常常利用分组语法代码/语法 说明 分类(exp) 匹配exp,并捕捉文本到自动命名的组里 捕捉(?exp) 匹配exp,并捕捉文本到名称为name的组里,也能够写成(?nameexp)(?:exp)
9、 匹配exp,不捕捉匹配的文本,也不给此分组分派组号(?=exp) 匹配exp前面的位置 零宽断言(?=exp) 匹配exp后面的位置(?!exp) 匹配后面跟的不是exp的位置(?exp) 贪婪子表达式(?-exp) 平稳组(?im-nsx:exp) 在子表达式exp中改变处置选项(?im-nsx) 为表达式后面的部份改变处置选项(?(exp)yes|no) 把exp看成零宽正向先行断言,假设是在那个位置能匹配,利用yes作为此组的表达式;不然利用no(?(exp)yes) 同上,只是利用空表达式作为no(?(name)yes|no) 假设是命名为name的组捕捉到了内容,利用yes作为表达
10、式;不然利用no(?(name)yes) 同上,只是利用空表达式作为no在VBA中利用正那么表达式,能够通过以下途径实现:创建正那么表达式对象:前期绑定:在VBA代码编辑器中的Tools菜单中,选中References.,然后引用Microsoft VBScript Regular Expressions 类库,然后直接概念对象:Dim reg As New RegExp。后期绑定:利用CreateObject方式概念对象:CreateObject()。前一种方式的优势是能够有编辑器的Intellisense支持?RegExp对象的属性:Global - 设置或返回一个 Boolean 值,该
11、值指明在整个搜索字符串时模式是全数匹配仍是只匹配第一个。假设是搜索应用于整个字符串,Global 属性的值应该为 True,不然其值为 False。默许的设置为True。Multiline - 返回正那么表达式是不是具有标志m, 缺省值为False。假设是指定的搜索字符串散布在多行,那个属性是要设置为True的。IgnoreCase - 设置或返回一个Boolean值,指明模式搜索是不是区分大小写。假设是搜索是区分大小写的,那么 IgnoreCase 属性应该为False;不然应该设为True。缺省值为True。Pattern - 设置或返回被搜索的正那么表达式模式。 被搜索的正那么字符串表达
12、式。它包括各类正那么表达式字符。RegExp对象的方式:Execute - 对指定的字符串执行正那么表达式搜索。需要传入要在其上执行正那么表达式的文本字符串。正那么表达式搜索的设计模式是通过 RegExp对象的Pattern来设置的。Execute方式返回一个Matches集合,其中包括了在string中找到的每一个匹配的Match对象。假设是未找到匹配,Execute将返回空的Matches集合。Replace -替换在正那么表达式查找中找到的文本?Test - 对指定的字符串执行一个正那么表达式搜索,并返回一个 Boolean 值指示是不是找到匹配的模式。属性对Test方式没有阻碍。假设是
13、找到了匹配的模式,Test方式返回True;不然返回False。MatchCollection对象与Match对象匹配到的所有对象放在MatchCollection集合中,那个集合对象只有两个只读属性:Count: 匹配到的对象的数量Item:集合的又一通用方式,需要传入Index值获取指定的元素。一样,能够利用For Each语句列举集合中的对象。集合中对象的类型是Match。Match对象有以下几个只读的属性:FirstIndex - 匹配字符串在整个字符串中的位置,值从0开始。Length -匹配字符串的长度?Value -匹配的字符串?SubMatches - 集合,匹配字符串中每一个
14、分组的值。作为集合类型,有Count和Item两个属性。正那么表达式很壮大,是处置文本的首选,不管你信不信,终归我是信了。说了很多,最后以一个小例子结尾吧:Sub Test() Dim reg As New RegExp With reg .Global = True .IgnoreCase = True .Pattern = d+ End With Dim mc As MatchCollection Dim m As match Set mc = (123aaaaa987uiiui999) For Each m In mc MsgBox NextEnd SubFunction ExRepla
15、ce(sStr As String, sReplStr As String, sPatrn As String) As String正那么表达式替换参数说明:sStr原字符串,sReplStr将替换的字符串,sPatrn样式返回参数,返回替换后的值 Dim regEX As Object Set regEX = CreateObject() RegEx为成立正那么表达式 = True 设置全局可用 = sPatrn 设置样式 ExReplace = (sStr, sReplStr) 执行替换 Set regEX = NothingEnd FunctionFunction ExExce(sStr
16、 As String, sPatrn As String, Optional IC As Boolean = True, Optional G As Boolean = True) As Object正那么表达式搜索参数说明:sStr原字符串,Patrn样式,IC是不是区别大小写,G是不是全局可用返回参数,返回的是一个对象,是搜索的数量 ExExce(n).FirstIndex搜索的第n个串的位置,n=0 ExExce(n).Value搜索的第n个串的值,n=0 Dim regEX As Object Set regEX = CreateObject() RegEx为成立正那么表达式 = Tr
17、ue 设置全局可用 = sPatrn 设置样式 = IC 设置是不是区分大小写。 Set ExExce = (sStr) 执行搜索 Set regEX = NothingEnd FunctionFunction ExTest(sStr As String, sPatrn As String, IC As Boolean) As Boolean正那么表达式匹配VBA代码参数说明:sStr原字符串,Patrn样式,IC是不是区别大小写返回参数,返回一个逻辑值,True为匹配,False为不匹配 Dim regEX As Object Set regEX = CreateObject() RegEx
18、为成立正那么表达式 = True 设置全局可用 = sPatrn 设置样式 = IC 设置是不是区分大小写。 ExTest = (sStr) 执行搜索测试 Set regEX = NothingEnd FunctionPublic Sub 去重复() Dim ss, re, rv ss = Is is the cost of of gasoline going up up?. & vbNewLine Set re = New RegExp = b(a-z+) 1b = True = True = True rv = (ss, $1) MsgBox rvEnd SubFunction RegEx
19、pTest(patrn, strng)正那么表达式(RegExp)对象提供简单的正那么表达式支持功能?下面的代码说明了RegExp对象的用法: Dim regEX, match, matches 成立变量。 Set regEX = New RegExp 成立正那么表达式。 = patrn 设置模式。 = True 设置是不是区分字符大小写。 = True 设置全局可用性。 Set matches = (strng) 执行搜索。 For Each match In matches 遍历匹配集合。 retStr = retStr & Match found at position retStr =
20、 retStr & & . Match Value is retStr = retStr & & . & vbCrLf Next RegExpTest = retStrEnd FunctionGlobal 属性设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全数匹配仍是只匹配第一个。 = True | False 对象 参数老是 RegExp 对象。假设是搜索应用于整个字符串,Global 属性的值为 True,不然其值为 False。默许的设置为 False。下面的代码说明了 Global 属性的用法(改变给予 Global 属性的值并观看其成效):Function Re
21、gExpTest1(patrn, strng) Dim regEX, match, matches 成立变量。 Set regEX = New RegExp 成立标准表达式。 = patrn 设置模式。 = True 设置是不是区分字母的大小写。 = True 设置全程性质。 Set matches = (strng) 执行搜索。 For Each match In matches 重复匹配集合 retStr = retStr & Match found at position RetStr=RetStr&.Match Value is RetStr=RetStr&.&vbCRLF Next
22、RegExpTest = retStr End Function IgnoreCase 属性 设置或返回一个Boolean值,指明模式搜索是不是区分大小写。 = True | False Object 参数老是一个 RegExp 对象。假设是搜索是区分大小写的,那么 IgnoreCase 属性为 False;不然为 True。缺省值为 False。 说明 下面的代码说明了 IgnoreCase 属性的用法(改变给予 IgnoreCase 属性的值以观看其成效):Function RegExpTest2(patrn, strng) Dim regEX, match, matches 成立变量。
23、Set regEX = New RegExp 成立正那么表达式。 = patrn 设置模式。 = True 设置不区分大小写。 = True 设置全局可用性 Set matches = (strng) 执行搜索。 For Each match In matches 重复匹配集合 retStr = retStr & Match found at position RetStr=RetStr&.Match Value is RetStr=RetStr&.&vbCRLF Next RegExpTest = retStrEnd FunctionExecute 方式对指定的字符串执行正那么表达式搜索?(
24、string)参数Object必选项。老是一个 RegExp 对象的名称。string必选项?要在其上执行正那么表达式的文本字符串?说明正那么表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。Execute 方式返回一个 Matches 集合,其中包括了在 string 中找到的每一个匹配的 Match 对象。假设是未找到匹配,Execute 将返回空的 Matches 集合。下面的代码说明了 Execute 方式的用法。Function RegExpTest3(patrn, strng) Dim regEX, match, matches Create variab
25、le. Set regEX = New RegExp Create a regular expression. = patrn Set pattern. = True Set case insensitivity. = True Set global applicability. Set matches = (strng) Execute search. For Each match In matches Iterate Matches collection. retStr = retStr & Match found at position retStr = retStr & & . Mat
26、ch Value is retStr = retStr & & . & vbCrLf Next RegExpTest = retStrEnd FunctionReplace 方式替换在正那么表达式查找中找到的文本?(string1, string2)参数Object必选项。老是一个 RegExp 对象的名称。string1必选项?string1 是将要进行文本替换的字符串?string2必选项。 string2 是替换文本字符串。说明被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。Replace 方式返回 string1 的副本,其中的 文本已经被替换为 string2。假设是没有找到匹配的文本,将返回原先的 string1 的副本。下面的例子说明了 Replace 方式的用法。Function ReplaceTest4(patrn, replStr) Dim regEX, str1 成立变量。 str1 = The quick brown fox jumped over the lazy dog. Set regEX = New RegExp 成立正那么表达式。 = patrn 设置模式。 = True 设
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1