EXCEL VBA 正那么表达式 从实例开始.docx
《EXCEL VBA 正那么表达式 从实例开始.docx》由会员分享,可在线阅读,更多相关《EXCEL VBA 正那么表达式 从实例开始.docx(32页珍藏版)》请在冰豆网上搜索。
EXCELVBA正那么表达式从实例开始
'EXCELVBA正那么表达式从实例开始
所有代码都测试过
'
'
'[2020-09-09:
'[2020-08-08:
'数据验证常常显现的情形是,需要验证和处置大量的文本内容,有时候需要查找字符串,有时候要按条件替换,而且这些待处置的问题仍是有必然的规律可循的,可是无法通过列举的方式挨个验证,那个时候就需要正那么表达式来帮忙。
'1.正那么表达式(RegularExpression)基础
' 正那么表达式是通用的文本搜索和处置方案,它的知识不是VBA特有的,大体上每种语言都内置了正那么表达式的功能。
正那么表达式的基础知识不是那个地址的重点,需要的朋友能够Google一下,或参看下面的一些入门教程:
'tutorials/regex/
'''中的正那么表达式应用
' 在VBA中利用正那么表达式,能够通过以下途径实现:
'创建正那么表达式对象:
'前期绑定:
在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用MicrosoftVBScriptRegularExpressions类库,然后直接概念对象:
DimregAsNewRegExp。
'后期绑定:
利用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值获取指定的元素。
'一样,能够利用ForEach语句列举集合中的对象。
集合中对象的类型是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,并捕捉文本到自动命名的组里捕捉
'(?
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换行符
'\eEscape
'\0nnASCII代码中八进制代码为nn的字符
'\xnnASCII代码中十六进制代码为nn的字符
'\unnnnUnicode代码中十六进制代码为nnnn的字符
'\cNASCII操纵字符。
比如\cC代表Ctrl+C
'\A字符串开头(类似^,但不受处置多行选项的阻碍)
'\Z字符串结尾或行尾(不受处置多行选项的阻碍)
'\z字符串结尾(类似$,但不受处置多行选项的阻碍)
'\G当前搜索的开头
'\p{name}Unicode中命名为name的字符类,例如\p{IsGreek}
'(?
>exp)贪婪子表达式
'(?
-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...",然后引用MicrosoftVBScriptRegularExpressions类库,然后直接概念对象:
DimregAsNewRegExp。
'后期绑定:
利用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值获取指定的元素。
'一样,能够利用ForEach语句列举集合中的对象。
集合中对象的类型是Match。
'Match对象有以下几个只读的属性:
'FirstIndex-匹配字符串在整个字符串中的位置,值从0开始。
'Length-匹配字符串的长度?
'Value-匹配的字符串?
'SubMatches-集合,匹配字符串中每一个分组的值。
作为集合类型,有Count和Item两个属性。
'
'正那么表达式很壮大,是处置文本的首选,不管你信不信,终归我是信了。
说了很多,
'最后以一个小例子结尾吧:
SubTest()
DimregAsNewRegExp
Withreg
.Global=True
.IgnoreCase=True
.Pattern="\d+"
EndWith
DimmcAsMatchCollection
DimmAsmatch
Setmc=("123aaaaa987uiiui999")
ForEachmInmc
MsgBox
Next
EndSub
FunctionExReplace(sStrAsString,sReplStrAsString,sPatrnAsString)AsString
'正那么表达式替换
'参数说明:
sStr原字符串,sReplStr将替换的字符串,sPatrn样式
'返回参数,返回替换后的值
DimregEXAsObject
SetregEX=CreateObject("")'RegEx为成立正那么表达式
=True'设置全局可用
=sPatrn'设置样式
ExReplace=(sStr,sReplStr)'执行替换
SetregEX=Nothing
EndFunction
FunctionExExce(sStrAsString,sPatrnAsString,OptionalICAsBoolean=True,OptionalGAsBoolean=True)AsObject
'正那么表达式搜索
'参数说明:
sStr原字符串,Patrn样式,IC是不是区别大小写,G是不是全局可用
'返回参数,返回的是一个对象,是搜索的数量
'ExExce(n).FirstIndex搜索的第n个串的位置,n>=0
'ExExce(n).Value搜索的第n个串的值,n>=0
DimregEXAsObject
SetregEX=CreateObject("")'RegEx为成立正那么表达式
=True'设置全局可用
=sPatrn'设置样式
=IC'设置是不是区分大小写。
SetExExce=(sStr)'执行搜索
SetregEX=Nothing
EndFunction
FunctionExTest(sStrAsString,sPatrnAsString,ICAsBoolean)AsBoolean
'正那么表达式匹配
'VBA代码
'参数说明:
sStr原字符串,Patrn样式,IC是不是区别大小写
'返回参数,返回一个逻辑值,True为匹配,False为不匹配
DimregEXAsObject
SetregEX=CreateObject("")'RegEx为成立正那么表达式
=True'设置全局可用
=sPatrn'设置样式
=IC'设置是不是区分大小写。
ExTest=(sStr)'执行搜索测试
SetregEX=Nothing
EndFunction
PublicSub去重复()
Dimss,re,rv
ss="Isisthecostofofgasolinegoingupup?
."&vbNewLine
Setre=NewRegExp
="\b([a-z]+)\1\b"
=True
=True
=True
rv=(ss,"$1")
MsgBoxrv
EndSub
FunctionRegExpTest(patrn,strng)
'正那么表达式(RegExp)对象
'提供简单的正那么表达式支持功能?
'下面的代码说明了RegExp对象的用法:
DimregEX,match,matches'成立变量。
SetregEX=NewRegExp'成立正那么表达式。
=patrn'设置模式。
=True'设置是不是区分字符大小写。
=True'设置全局可用性。
Setmatches=(strng)'执行搜索。
ForEachmatchInmatches'遍历匹配集合。
retStr=retStr&"Matchfoundatposition"
retStr=retStr&&".MatchValueis'"
retStr=retStr&&"'."&vbCrLf
Next
RegExpTest=retStr
EndFunction
'Global属性
'设置或返回一个Boolean值,该值指明在整个搜索字符串时模式是全数匹配仍是只匹配第一个。
'[=True|False]
'对象参数老是RegExp对象。
假设是搜索应用于整个字符串,Global属性的值为True,不然其值为False。
默许的设置为False。
'下面的代码说明了Global属性的用法(改变给予Global属性的值并观看其成效):
FunctionRegExpTest1(patrn,strng)
DimregEX,match,matches'成立变量。
SetregEX=NewRegExp'成立标准表达式。
=patrn'设置模式。
=True'设置是不是区分字母的大小写。
=True'设置全程性质。
Setmatches=(strng)'执行搜索。
ForEachmatchInmatches'重复匹配集合
retStr=retStr&"Matchfoundatposition"
RetStr=RetStr&&".MatchValueis'"
RetStr=RetStr&&"'."&vbCRLFNext
RegExpTest=retStr
EndFunction
'IgnoreCase属性
'设置或返回一个Boolean值,指明模式搜索是不是区分大小写。
'[=True|False]
'Object参数老是一个RegExp对象。
假设是搜索是区分大小写的,那么IgnoreCase属性为False;不然为True。
缺省值为False。
'说明
'下面的代码说明了IgnoreCase属性的用法(改变给予IgnoreCase属性的值以观看其成效):
FunctionRegExpTest2(patrn,strng)
DimregEX,match,matches'成立变量。
SetregEX=NewRegExp'成立正那么表达式。
=patrn'设置模式。
=True'设置不区分大小写。
=True'设置全局可用性
Setmatches=(strng)'执行搜索。
ForEachmatchInmatches'重复匹配集合
retStr=retStr&"Matchfoundatposition"
RetStr=RetStr&&".MatchValueis'"
RetStr=RetStr&&"'."&vbCRLF
Next
RegExpTest=retStr
EndFunction
'Execute方式
'对指定的字符串执行正那么表达式搜索?
'(string)
'参数
'Object
'必选项。
老是一个RegExp对象的名称。
'string
'必选项?
要在其上执行正那么表达式的文本字符串?
'说明
'正那么表达式搜索的设计模式是通过RegExp对象的Pattern来设置的。
'Execute方式返回一个Matches集合,其中包括了在string中找到的每一个匹配的Match对象。
假设是未找到匹配,Execute将返回空的Matches集合。
'下面的代码说明了Execute方式的用法。
FunctionRegExpTest3(patrn,strng)
DimregEX,match,matches'Createvariable.
SetregEX=NewRegExp'Createaregularexpression.
=patrn'Setpattern.
=True'Setcaseinsensitivity.
=True'Setglobalapplicability.
Setmatches=(strng)'Executesearch.
ForEachmatchInmatches'IterateMatchescollection.
retStr=retStr&"Matchfoundatposition"
retStr=retStr&&".MatchValueis'"
retStr=retStr&&"'."&vbCrLf
Next
RegExpTest=retStr
EndFunction
'Replace方式
'替换在正那么表达式查找中找到的文本?
'(string1,string2)
'参数
'Object
'必选项。
老是一个RegExp对象的名称。
'string1
'必选项?
string1是将要进行文本替换的字符串?
'string2
'必选项。
string2是替换文本字符串。
'说明
'被替换的文本的实际模式是通过RegExp对象的Pattern属性设置的。
'Replace方式返回string1的副本,其中的文本已经被替换为string2。
假设是没有找到匹配的文本,将返回原先的string1的副本。
'下面的例子说明了Replace方式的用法。
FunctionReplaceTest4(patrn,replStr)
DimregEX,str1'成立变量。
str1="Thequickbrownfoxjumpedoverthelazydog."
SetregEX=NewRegExp'成立正那么表达式。
=patrn'设置模式。
=True'设