版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、EXCEL VBA正则表达式从实例开始所有代码都测试过,2011-09-09 : '2010-08-08 :'数据验证经常出现的情况是,需要验证和处理大量的文本 内容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。,1.正则表达式(Regular Expression) 基础,正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都内置了正则表达式的功能。正则表达式的基础知识不是这里的重点,需要的朋友可以 Google 一下,或者参看下面的一些入门教程
2、: 'tutorials/regex/'''中的正则表达式应用, 在VBA中使用正则表达式,可以通过下列途径实现: ,创建正则表达式对象:,前期绑定:在VBA代码编辑器中的"Tools"菜单中,选中"References.",然后引用Microsoft VBScript Regular Expressions类库,然后直接定义对象: Dim reg As NewRegExp '后期绑定:使用 CreateObject方法定义对象: CreateObject("") 。,前一种方式的优点是可以有编
3、辑器的Intellisense 支持'RegExp对象的属性:,Global -设置或返回一个 Boolean值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global属性的值应该为True ,否则其值为False。默认的设置为True。,Multiline -返回正则表达式是否具有标志m,缺省值为False。如果指定的搜索字符串分布在多行,这个属性是要设置为True的。,IgnoreCase -设置或返回一个 Boolean值,指明模式搜索是否区分大小写。如果搜索是区 分大小写的,则IgnoreCase 属性应该为False ;否则应该设为
4、True。缺省值为True。 ,pattern -设置或返回被搜索的正则表达式模式。被搜索的正则字符串表达式。它包含各种正则表达式字符。,RegExp对象的方法:Execute -对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过RegExp对象的Pattern 来设置的。Execute方法返回一个 Matches集合,其中包含了在string 中找到的每一个匹配的 Match对象。如 果未找到匹配,Execute将返回空的 Matches集合。,Replace -替换在正则表达式查找中找到的文本Test -对指定的字符串执行一个正则表
5、达式搜索,并返回一个 Boolean值指示是否找到匹配的模式。属性对 Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。,MatchCollection对象与 Match 对象,匹配到的所有对象放在MatchCollection集合中,这个集合对象只有两个只读属性:,Count:匹配到的对象的数目,|tem :集合的又一通用方法,需要传入Index值获取指定的元素。'一般,可以使用 For Each语句枚举集合中的对象。集合中对象的类型是Match。,Match对象有以下几个只读的属性:,FirstIndex -匹配字符串在整个字符串中的位置,值
6、从0开始。,Length -匹配字符串的长度,Value -匹配的字符串'SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有 Count和Item两个 属性。 ,常用的正则表达式主要有以下几种:,匹配中文字符的正则表达式:u4e00-u9fa5,评注:匹配中文还真是个头疼的事,有了这个表达式就好办了'匹配双字节字符 (包括汉字在内):Ax00-xff,评注:可以用来计算字符串的长度(一个双字节字符长度计2, ASCII字符计1),匹配空白行的正则表达式:ns*r,评注:可以用来删除空白行'匹配 HTMLfe记的正则表达式:<(S*)a>
7、;*>.*</>|<.* />,评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无 能为力,匹配首尾空白字符的正则表达式:As*|s*$,评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式'匹配 Email 地址的正则表达式:w+(-+.w+)*w+(-.w+)*.w+(-.w+)*,评注:表单验证时很实用'匹配网址URL的正则表达式:a-zA-z+:d+.d+.d+,评注:提取ip地址时有用,匹配特定数字:'A1-9d*$d*|0.d*1-9d*$d*|0.d*1-9d*)$
8、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匹配单词的开始或结束'A匹配字符串的开始,$匹配字符串的结束,表2.常用的限定符'代码/语法 说明,*重复零次或更多次,重复一次或更多次+,Print重复零次或一次,n 重复n次,n,重复n次或更多次,n,m重复n到m次,表3.常用的反义代码'代码/语法 说明'W 匹配任意不是字母,数字,下划线,汉字的字符'S匹配任意不是空白符的字符'D匹配任意非
9、数字的字符'B匹配不是单词开头或结束的位置'Ax匹配除了 x以外的任意字符,Aaeiou匹配除了 aeiou这几个字母以外的任意字符',表4.常用分组语法'代码/语法 说明 分类,(exp) 匹配exp,并捕获文本到自动命名的组里捕获'(<name>exp) 匹配exp,并捕获文本到名称为 name的组里,也可以写成('name'exp),(:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号'(=exp) 匹配exp前面的位置 零宽断言'(<=exp)匹配exp后面的位置'(!exp)匹
10、配后面跟的不是 exp的位置'(<!exp)匹配前面不是exp的位置,(#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读注释 ,表5.懒惰限定符'代码/语法 说明,*重复任意次,但尽可能少重复,+ 重复1次或更多次,但尽可能少重复,重复0次或1次,但尽可能少重复,n,m)重复n到m次,但尽可能少重复,n,重复n次以上,但尽可能少重复,表6.常用的处理选项,名称说明,IgnoreCase(忽略大小写)匹配时不区分大小写。,Multiline(多行模式)更改人和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结
11、尾匹配。(在此模式下,$的精确含意是:匹配n之前的位置以及字符串结束前的位置.),Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符n )。,IgnorePatternWhitespace(忽略空白)忽略表达式中的非转义空白并启用由#标记的注释。,ExplicitCapture(显式捕获)仅捕获已被显式命名的组。,表7.尚未详细讨论的语法'代码/语法 说明'a报警字符(打印它的效果是电脑嘀一声),b通常是单词分界位置,但如果在字符类里使用代表退格't制表符,Tab'r 回车'v竖向制表符'f 换页符'n 换行
12、符'e Escape'0nn ASCII代码中八进制代码为 nn的字符'xnn ASCII代码中十六进制代码为 nn的字符'unnnn Unicode代码中十六进制代码为nnnn的字符'cN ASCII 控制字符。比如cC代表Ctrl+C'A 字符串开头(类似人,但不受处理多行选项的影响)'Z字符串结尾或行尾(不受处理多行选项的影响)'z 字符串结尾(类似$,但不受处理多行选项的影响)'G当前搜索的开头'pname Unicode中命名为 name的字符类,例如 pIsGreek'(>exp) 贪婪子
13、表达式'(<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中使用正则表达式,可以通过下列途径实现:,创建正则表达式对象:'
14、;前期绑定:在 VBA代码编辑器中的"Tools"菜单中,选中"References.",然后引用 Microsoft VBScript Regular Expressions类库,然后直接定义对象:Dim reg As NewRegExp'后期绑定:使用 CreateObject方法定义对象:CreateObject("") 。,前一种方式的优点是可以有编辑器的Intellisense 支持'RegExp对象的属性:,Global -设置或返回一个 Boolean值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配
15、第一个。如果搜索应用于整个字符串,Global属性的值应该为True ,否则其值为False。默认的设置为True。,Multiline -返回正则表达式是否具有标志m,缺省值为False。如果指定的搜索字符串分布在多行,这个属性是要设置为True的。,IgnoreCase -设置或返回一个 Boolean值,指明模式搜索是否区分大小写。如果搜索是区 分大小写的,则IgnoreCase 属性应该为False ;否则应该设为 True。缺省值为True。,Pattern -设置或返回被搜索的正则表达式模式。被搜索的正则字符串表达式。它包含各种正则表达式字符。'RegExp对象的方法:,E
16、xecute -对指定的字符串执行正则表达式搜索。需要传入要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过RegExp对象的Pattern 来设置的。Execute方法返回一个Matches集合,其中包含了在 string 中找到的每一个匹配的 Match对象。如 果未找到匹配,Execute将返回空的 Matches集合。,Replace -替换在正则表达式查找中找到的文本,Test -对指定的字符串执行一个正则表达式搜索,并返回一个Boolean值指示是否找到匹配的模式。属性对 Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。
17、39;MatchCollection 对象与 Match 对象,匹配到的所有对象放在MatchCollection 集合中,这个集合对象只有两个只读属性:,Count: 匹配到的对象的数目,Item :集合的又一通用方法,需要传入Index值获取指定的元素。,一般,可以使用 For Each语句枚举集合中的对象。集合中对象的类型是Match。,Match对象有以下几个只读的属性:,FirstIndex -匹配字符串在整个字符串中的位置,值从0开始。Length -匹配字符串的长度Value -匹配的字符串,SubMatches - 集合,匹配字符串中每个分组的值。作为集合类型,有 Count和
18、Item两个 属性。 ,正则表达式很强大,是处理文本的首选,不管你信不信,反正我是信了。说了很多, ,最后以一个小例子结尾吧:Sub Test()Dim reg As New RegExpWith reg.Global = True.IgnoreCase = True.Pattern = "d+"End WithDim mc As MatchCollectionDim m As matchSet mc = ("123aaaaa987uiiui999")For Each m In mcMsgBoxNextEnd SubFunction ExReplace(
19、sStr As String,正则表达式替换,参数说明:sStr原字符串,sReplStr,返回参数,返回替换后的值Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx=True,sReplStr As String, sPatrn As String) As String将替换的字符串,sPatrn样式为建立正则表达式 设置全局可用=sPatrn'设置样式ExReplace = (sStr, sReplStr)'执行替换Set regEX = NothingEnd FunctionFuncti
20、on ExExce(sStr As String, sPatrn As String, Optional IC As Boolean = True, Optional G As Boolean = True) As Object,正则表达式搜索'参数说明:sStr原字符串,Patrn样式,IC是否区别大小写,G是否全局可用 '返回参数,返回的是一个对象,是搜索的数量n>=0'ExExce(n).FirstIndex搜索白第n个串的位置,'ExExce(n).Value搜索白第n个串的值,n>=0Dim regEX As ObjectSet regEX
21、 = CreateObject("") 'RegEx为建立正则表达式=True'设置全局可用=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是否区别大小写'返回参数
22、,返回一个逻辑值,True为匹配,False为不匹配Dim regEX As ObjectSet regEX = CreateObject("") 'RegEx为建立正则表达式=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
23、Set re = New RegExp="b(a-z+) 1b”=True=True=Truerv = (ss, "$1")MsgBox rvEnd SubFunction RegExpTest(patrn, strng)'正则表达式(RegExp)对象 ,提供简单的正则表达式支持功能 '下面的代码说明了 RegExp对象的用法:Dim regEX, match, matches'Set regEX = New RegExp'=patrn'=True'=True'Set matches = (strng)
24、39;For Each match In matches'retStr = retStr & "Match found at position " retStr = retStr & & ". Match Value is '"建立变量。建立正则表达式。设置模式。设置是否区分字符大小写。设置全局可用性。执行搜索。遍历匹配集合。retStr = retStr & & ",." & vbCrLfNextRegExpTest = retStrEnd Function '
25、Global 属性,设置或返回一个 Boolean值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第 一个。'=True | False '对象参数总是RegExp对象。如果搜索应用于整个字符串,Global属性的值为True ,否则其值为False。默认的设置为 False。'下面的代码说明了 Global属性的用法(改变赋予Global属性的值并观察其效果):Function RegExpTest1(patrn, strng) Dim regEX, match, matches Set regEX = New RegExp =patrn'=True
26、39;=True'Set matches = (strng) ' For Each match In matches建立变量。建立规范表达式。设置模式。设置是否区分字母的大小写。设置全程性质。执行搜索。重复匹配集合retStr = retStr & "Match found at position RetStr=RetStr&&".Match Value is '"RetStr=RetStr&&"'."&vbCRLF NextRegExpTest = retStrE
27、nd Function'IgnoreCase 属性'设置或返回一个 Boolean值,指明模式搜索是否区分大小写。'=True | False 'Object参数总是一个 RegExp对象。如果搜索是区分大小写的,则IgnoreCase 属性为False ;否则为 True。缺省值为 False 。'说明' 下面的代码说明了 IgnoreCase 属性的用法(改变赋予IgnoreCase 属性的值以观察其效果):Function RegExpTest2(patrn, strng)Dim regEX, match, matchesSet regEX
28、 = 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&&"'."&vb
29、CRLFNextRegExpTest = retStrEnd Function'Execute 方法对指定的字符串执行正则表达式搜索'(string)参数'Object'必选项。总是一个RegExp对象的名称。'string'必选项要在其上执行正则表达式的文本字符串'说明'正则表达式搜索的设计模式是通过RegExp对象的Pattern 来设置的。'Execute 方法返回一个Matches集合,其中包含了在string中找到的每一个匹配的Match对象。如果未找到匹配,Execute将返回空的 Matches集合。卜面的代
30、码说明了Execute 方法的用法。Function RegExpTest3(patrn, strng)Dim regEX, match, matches ' Create variable.Set regEX = New RegExp ' Create a regular expression.= patrn ' Set pattern.= True ' Set case insensitivity.= True ' Set global applicability.Set matches = (strng) ' Execute search.
31、For Each match In matches ' Iterate Matches collection.retStr = retStr & "Match found at position retStr = retStr & & ". Match Value is '" retStr = retStr & & "." & vbCrLfNextRegExpTest = retStrEnd Function'Replace 方法替换在正则表达式查找中找到的文本'(
32、string1, string2)'Object,必选项。总是一个RegExp对象的名称。'stringl'必选项stringl是将要进行文本替换的字符串'string2'必选项。string2是替换文本字符串。'说明'被替换的文本的实际模式是通过RegExp对象的Pattern属性设置的。'Replace 方法返回stringl的副本,其中的 文本已经被替换为 string2 。如果没有找到匹配的文本,将返回原来的stringl的副本。'下面的例子说明了Replace方法的用法。建立变量。Function Replace
33、Test4(patrn, replStr)Dim regEX, str1str1 = "The quick brown fox jumped over the lazy dog.建立正则表达式。设置模式。设置是否区分大小写。作替换。将'fox' 替换为Set regEX = New RegExp = patrn'= True'ReplaceTest = (str1, replStr) End Function 'MsgBox(ReplaceTest("fox", "cat") 'cat'。
34、'另外,Replace方法在模式中替换subexpressions 。 下面对以前示例中函数的调用,替换了原字符串中的所有字对:'MsgBox (ReplaceText("(S+)(s+)(S+)", "$3$2$1")'交换词对.'test 方法'对指定的字符串执行一个正则表达式搜索,并返回一个Boolean值指示是否找到匹配的模式。'(string)'参数'Object'必选项。总是一个RegExp对象的名称。'string'必选项要执行正则表达式搜索的文本字符串
35、'说明'正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的属性对 Test方法没有影响'如果找到了匹配的模式,Test方法返回True;否则返回False。'下面的代码说明了 Test方法的用法Function RegExpTest5(patrn, strng)Dim regEX, retVal'建立变量。Set regEX = New RegExp'建立正则表达式。=patrn'设置模式。设置是否区分大小写。执行搜索测试。找到一个或多个匹配。"未找到匹配。"=False retVal = (s
36、trng) If retVal ThenRegExpTest = ElseRegExpTest = End IfEnd Function'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4")'Match对象'提供了对正则表达式匹配的只读属性的访问'说明'Match对象只能通过 RegExp对象的Execute 方法来创建,该方法实际上返回了Match对象的集合。所有的 Match对象属性都是只读的。在执行正则表达式时,可能产生零个或多个Match对象。每个 Match对象提供了被
37、正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。'下面的代码说明了Match对象的用法:Function RegExpTest6(patrn, strng)Dim regEX, match, matches '建立变量。Set regEX = New RegExp '建立正则表达式。=patrn '设置模式。=True '设置是否区分大小写。=True '设置全局替换。Set matches = (strng) '执行搜索。For Each match In matches'遍历 Matches 集合。r
38、etStr = retStr & "Match " & i & " found at position "retStr = retStr & & ". Match Value is "'retStr = retStr & & "." & vbCrLfNextRegExpTest = retStrEnd Function'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4&q
39、uot;)'Matches 集合'正则表达式Match对象的集合。 ''说明'Matches 集合中包含若干独立的Match 对象,只能使用 RegExp对象的Execute 方法来创建之。与独立的Match对象属性相同,Matches '集合的一个属性是只读的。'在执行正则表达式时,可能产生零个或多个Match对象。每个 Match对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索弓I。,下面的代码将说明如何使用正则表达式查找获得Function RegExpTest7(patrn, strng)Dim
40、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 & & ",." &am
41、p; vbCrLfNextRegExpTest = retStr End Function 'MsgBox (RegExpTest("is.", "IS1 is2 IS3 is4")'SubMatches8 集合,正则表达式子匹配字符串的集合 ,说明'SubMatches集合包含了单个的子匹配字符串, SubMatches集合的属性是只读的。Matches集合,以及如何循环遍历集合:创建变量。创建正则表达式。设置模式。设置是否区分大小写。设置全程匹配。执行搜索。循环遍历Matches只能用RegExp对象的Execute 方法创建
42、。'运行一个正则表达式时,当圆括号中捕捉到子表达式时可以有零个或多个子匹配。'SubMatches集合中的每一项是由正则表达式找到并捕获的的字符串。'下面的代码演示了如何从一个正则表达式获得一个SubMatches集合以及如何操作它的专有成员:Sub MatchTest8() inpStr = ""Dim oRe, oMatch, oMatchesSet oRe = New RegExp'查找一个电子邮件地址(不是一个理想的RegExp)="(w+)(w+).(w+)”' 得到Matches集合Set oMatches =
43、(inpStr)' 因为只有一个地址,所以,集合只有一项,就是索引 =0 的那个' 得到Matches集合中的第一项Set oMatch = oMatches(0)' 创建结果字符串。' Match对象是完整匹配retStr ="电子邮件地址是:"& oMatch & vbNewLine,得到地址的子匹配部分。retStr = retStr & "电子邮件别名是:"& (0)' dragonretStr = retStr & vbNewLineretStr = retStr
44、& "组织是:"& (1)' xyzzySubMatchTest = retStrMsgBox retStr谢谢!")End Sub'MsgBox(SubMatchTest("请写信到。Sub jj1(),把数字筛选出来不包含括号的数字Dim kk()Set x = CreateObject("")=1"A(.*)(.*"For Each y In a2:h2 ReDim Preserve kk(1 To j) If (y) ThenSet mchs = (y)Set mc = mc
45、hs(0)retStr = (0)kk(j) = Val(retStr)j = j + 1 End IfNextMsgBox (kk)End SubSub jj(),把数字筛选出来不包含括号的数字Dim kk()Set x = CreateObject("")=1"A(.*)(.*"j = 1For Each y In a2:h2ReDim Preserve kk(1 To j)If (y) Thenkk(j) = Val(y)(0).SubMatches(0) j = j + 1End IfNextMsgBox (kk)End SubSub删除空格()
46、Dim reg As ObjectDim arrDim i As Integerrw = Range("A65536 ).End(xlUp).RowColumns("B").ClearContentsarr = Range("A1:A" & rw)Set reg = CreateObject("")With reg.Global = True.IgnoreCase = True.Pattern = "A ",符合样式就用""替换End WithFor i = 1 To UBou
47、nd(arr)Range("B" & i) = (arr(i, 1),"")NextEnd Sub,过程删除空格(), 定义变量reg 为对象' 定义变量arr, 定义变量i为长整型值,j 为长整型值'i = 单元格区域(“a65536).结束(方向向上).行标,列坐标(“b”).清除内容'arr =单元格区域("a1:a" & i)' 设置 reg = 创建对象("vbscript . regexp ")' 工作于reg,. 全局=True'. 忽略
48、大小写=True'. 样式="人”,结束工作于,循环范围j = 1 到i,单元格区域(“b" & j) = reg . 替换字符串(arr(j ,1),"")' 下一句' 结束过程,正则表达式示例1提取字符串中的数字Sub getNum1(),这种使用方式需要"工具""引用",弓 I用 Microsoft VBScript Regular Expressions 类库Dim reg As New RegExpWith reg.Global = True.IgnoreCase = Tr
49、ue.Pattern = "d+"End WithDim mc As MatchCollectionDim m As matchSet mc = ("123aaaaa987uiiui999")For Each m In mcMsgBox + 1NextEnd Sub,正则表达式示例 2用"字符串"替换原字符串中符合匹配模式的部分Sub getNum2()字符串,"分隔符")Dim arrarr = Split("A12B-R1E2W-E1T-R2T-Q1B2Y3U4D", "-&quo
50、t;) ' split(拆分字符串With CreateObject("")'For i = 0 To UBound(arr) .Global = True ' .Pattern = "FA-Z"' sr = .Replace(arr(i),"")' 换为空字符c = c & sr & ""NextEnd With生成一个正则表达式对象实例设置全局可用,即替换所有符合匹配模式的字符串 匹配模式为非大写字母将 arr(i)字符串中符合匹配模式的部分替MsgBox
51、 cEnd SubFunction zldccmx(rng As Range, Ms As Integer) Dim ys(1 To 12): Dim regEXys(1) = "AA-Za-z0-9"'只保留字母和数字ys(2) = "。-"' ys(3) = "!-w"ys(4) = "d"' ys(5) = "Ad"' ys(6) = "D"'ys(7) = "a-zA_Z"' ys(8) = &quo
52、t;3*a*”' ys(9) = "36*"' ys(10) = "A3"' ys(11) = "A0-9."'去除中文留中文(留数字)去除英文大小写字符去除所有指定字符,这里指去除去除所有指定字符,这里指去除3和a"36"去除所有非特定字符,这里指去除不是3的字符只保留数字和小数点保留数字和运算符号+-*/a'RegEx为建立正则表达式ys(12) = "A0-9/.+-a*a"'Set regEX = CreateObject("&q
53、uot;)=True '设置全局可用=ys(Ms)' 样式zldccmx = (rng,"")Set regEX = Nothing End Function'问题:字符串中1个或者连续多个空格替换成一个Tab键'分析:由于字符串中连续的空格的个数不太确定,如果我们逐个字符去分析的话, 也是比较麻烦的,但如果用正则去实现,则简单的多。这也是一个典型的适合用正则解决 的问题。,解决方式如下:Sub Test7()Dim regEX As Object, strstr = "abc de fg"Set regEX = Crea
54、teObject("")With regEX.Global = True.Pattern = "'s+"End With st = (str,"") MsgBox st Set regEX = NothingEnd SubSub test1()Dim strSet reg = CreateObject("")=True="d9”str = "aaaaaaa9qqqqqqqqqqqq1aaaa"Set col = (str)If > 0 ThenFor Each mch I
55、n col sm = sm & & ""NextEnd IfMsgBox sm End SubSub r_1()'1) Global 属性,False,如果找到匹配的字符,就停止搜索(默认值),True,搜索字符串中全部字符Dim regEX As ObjectDim x As String x = "a1b2c3”Set regEX = CreateObject("")With regEX .Global = True '.Global = False ' .Pattern = "d"
56、;MsgBox .Replace(x, "#")End WithEnd Sub'2) IgnoreCase 属性'如果搜索是区分大小写的,为 'True不分Sub r_2()Dim regEX As ObjectDim x As Stringx = "a1A2"Set regEX = CreateObject("")With regEX .Global = True .IgnoreCase = True '.IgnoreCase = False ' .Pattern = "A"
57、;'MsgBox .Replace(x, "#")End WithEnd Sub'3) Multiline 属性' 返回正则表达式是否具有标志Sub r_3()Dim regEX As ObjectDim x As Stringx = "a1b2" & Chr(13) & "c3d4" Set regEX = CreateObject("") With regEX .Global = True ' .MultiLine = True .Pattern = "
58、d+$" MsgBox .Replace(x, "#")End With返回"a#b#c#"返回"a#b2c3”数字字符匹配False (缺省值)返回"#1#2"返回"ab#2"数字字符匹配m ,缺省值为FalseEnd Sub'4) Pattern 属性'一个字符串,用来定义正则表达式。缺省值为空文本。'5) Execute 方法' 返回一个MatchCollection 对象,该对象包含每个成功匹配的Match对象。Sub r_5()Dim regEX As
59、ObjectDim matchs As Object, match As ObjectDim x As String, y As String x = "alb2c3”Set regEX = CreateObject("")With regEX .Global = True .Pattern = "d"'匹配数字Set matchs = .Execute(x) For Each match In matchsy = y & match NextEnd WithMsgBox y 'y 返回 123 End Sub '
60、;6) Test 方法'返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。Sub r_6()Dim regEX As ObjectDim x As String, y As StringDim i As Integer x = "alb2c3” Set regEX = CreateObject("") With regEX.Global = True.Pattern = "d"For i = 1 To Len(x)If .Test(Mid(x, i, 1) Then y = y & Mid(x, i, 1) Next iE
61、nd WithMsgBox y'y返回 123End SubPublic Sub ty2()'提取英文字母并去重复Dim arr, i&, y, str$str = "$A$8,$D$11,$D$5,$D$10,$G$12”With CreateObject("") .Global = True .Pattern = "$,0-9" str = .Replace(str,"") .Pattern = "(.)11," str = .Replace(str, "$1")End With strEnd Sub'把文件中的空白行去掉:假设d盘有一个文本,内容如下7 6 2 9 5 8 3 4 19 3 1 4 2 7 8 5 66 9 3 8 7 5 1 2 45 1 8 3 4 2 6 9 72 4 7 6 1 9 5 3 8,3 26 7 8 4 9 1 5 ,4 8 9 5 3 1 7 6 2 ,1 7 5 2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版家电产品消费者满意度调查服务合同2篇
- 二零二五版房地产融资居间代理合同范本3篇
- 二零二五年电影联合制作与市场推广合同2篇
- 二零二五版茶叶茶具专卖店加盟管理合同3篇
- 二零二五版汽车购置贷款保证担保合同3篇
- 二零二五年度化肥原料进口与分销合同3篇
- 二零二五年度航空航天股权买卖合同范本3篇
- 二零二五版户外广告牌定期检查与维修合同3篇
- 二零二五年度驾校车辆购置税承包合同3篇
- 国际贸易第六章出口合同订立2025年绿色贸易标准与认证3篇
- 15.5-博物馆管理法律制度(政策与法律法规-第五版)
- 水泥厂钢结构安装工程施工方案
- 2023光明小升初(语文)试卷
- 三年级上册科学说课课件-1.5 水能溶解多少物质|教科版
- GB/T 7588.2-2020电梯制造与安装安全规范第2部分:电梯部件的设计原则、计算和检验
- GB/T 14600-2009电子工业用气体氧化亚氮
- 小学道德与法治学科高级(一级)教师职称考试试题(有答案)
- 河北省承德市各县区乡镇行政村村庄村名居民村民委员会明细
- 实用性阅读与交流任务群设计思路与教学建议
- 应急柜检查表
- 通风设施标准
评论
0/150
提交评论