EXCEL VBA 正则表达式 从实例开始.docx
- 文档编号:6208550
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:33
- 大小:30.11KB
EXCEL VBA 正则表达式 从实例开始.docx
《EXCEL VBA 正则表达式 从实例开始.docx》由会员分享,可在线阅读,更多相关《EXCEL VBA 正则表达式 从实例开始.docx(33页珍藏版)》请在冰豆网上搜索。
EXCELVBA正则表达式从实例开始
'EXCELVBA正则表达式从实例开始
所有代码都测试过
'
'
'[2011-09-09:
.cnblogs./dxy1982/archive/2011/09/09/2159246.html]
'[2010-08-08:
.excelpx./thread-137472-1-1.html]
'数据验证经常出现的情况是,需要验证和处理大量的文本容,有时候需要查找字符串,有时候要按条件替换,并且这些待处理的问题还是有一定的规律可循的,但是无法通过枚举的方式挨个验证,这个时候就需要正则表达式来帮忙。
'1.正则表达式(RegularExpression)基础
' 正则表达式是通用的文本搜索和处理方案,它的知识不是VBA独有的,基本上每种语言都置了正则表达式的功能。
正则表达式的基础知识不是这里的重点,需要的朋友可以Google一下,或者参看下面的一些入门教程:
'
'.regexlab./zh/regref.htm
'.williamlong.info/archives/433.html
'2.VBA中的正则表达式应用
' 在VBA中使用正则表达式,可以通过下列途径实现:
'创建正则表达式对象:
'前期绑定:
在VBA代码编辑器中的"Tools"菜单中,选中"References...",然后引用MicrosoftVBScriptRegularExpressions5.5类库,然后直接定义对象:
DimregAsNewRegExp。
'后期绑定:
使用CreateObject方法定义对象:
CreateObject("VBSCRIPT.REGEXP")。
'前一种方式的优点是可以有编辑器的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值指示是否找到匹配的模式。
RegExp.Global属性对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]+:
//[^\s]*
'评注:
网上流传的版本功能很有限,上面这个基本可以满足需求
'匹配是否合法(字母开头,允许5-16字节,允许字母数字下划线):
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
'评注:
表单验证时很实用
'匹配国:
\d-\d|\d-\d
'评注:
匹配形式如0或2
'匹配腾讯QQ号:
[1-9][0-9]{4,}
'评注:
腾讯QQ号从10000开始
'匹配中国邮政编码:
[1-9]\d(?
!
\d)
'评注:
中国邮政编码为6位数字
'匹配:
\d|\d
'评注:
中国的为15位或18位
'匹配ip地址:
\d+\.\d+\.\d+\.\d+
'评注:
提取ip地址时有用
'匹配特定数字:
'^[1-9]\d*$ //匹配正整数
'^-[1-9]\d*$//匹配负整数
'^-?
[1-9]\d*$ //匹配整数
'^[1-9]\d*|0$ //匹配非负整数(正整数+0)
'^-[1-9]\d*|0$ //匹配非正整数(负整数+0)
'^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
'^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
'^-?
([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?
\.0+|0)$ //匹配浮点数
'^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?
\.0+|0$ //匹配非负浮点数(正浮点数+0)
'^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?
\.0+|0$ //匹配非正浮点数(负浮点数+0)
'评注:
处理大量数据时有用,具体应用时注意修正
'匹配特定字符串:
'^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
'^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
'^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
'^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
'^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
'评注:
最基本也是最常用的一些表达式
'
'代码/语法说明
'匹配除换行符以外的任意字符.
'\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)匹配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)贪婪子表达式
'(?
'(?
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...",然后引用MicrosoftVBScriptRegularExpressions5.5类库,然后直接定义对象:
DimregAsNewRegExp。
'后期绑定:
使用CreateObject方法定义对象:
CreateObject("VBSCRIPT.REGEXP")。
'前一种方式的优点是可以有编辑器的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值指示是否找到匹配的模式。
RegExp.Global属性对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=reg.Execute("123aaaaa987uiiui999")
ForEachmInmc
MsgBoxm.Value
Next
EndSub
FunctionExReplace(sStrAsString,sReplStrAsString,sPatrnAsString)AsString
'正则表达式替换
'参数说明:
sStr原字符串,sReplStr将替换的字符串,sPatrn样式
'返回参数,返回替换后的值
DimregEXAsObject
SetregEX=CreateObject("VBSCRIPT.REGEXP")'RegEx为建立正则表达式
regEX.Global=True'设置全局可用
regEX.Pattern=sPatrn'设置样式
ExReplace=regEX.Replace(sStr,sReplStr)'执行替换
SetregEX=Nothing
EndFunction
FunctionExExce(sStrAsString,sPatrnAsString,OptionalICAsBoolean=True,OptionalGAsBoolean=True)AsObject
'正则表达式搜索
'参数说明:
sStr原字符串,Patrn样式,IC是否区别大小写,G是否全局可用
'返回参数,返回的是一个对象,ExExce.Count是搜索的数量
'ExExce(n).FirstIndex搜索的第n个串的位置,n>=0
'ExExce(n).Value搜索的第n个串的值,n>=0
DimregEXAsObject
SetregEX=CreateObject("VBSCRIPT.REGEXP")'RegEx为建立正则表达式
regEX.Global=True'设置全局可用
regEX.Pattern=sPatrn'设置样式
regEX.IgnoreCase=IC'设置是否区分大小写。
SetExExce=regEX.Execute(sStr)'执行搜索
SetregEX=Nothing
EndFunction
FunctionExTest(sStrAsString,sPatrnAsString,ICAsBoolean)AsBoolean
'正则表达式匹配
'VBA代码
'参数说明:
sStr原字符串,Patrn样式,IC是否区别大小写
'返回参数,返回一个逻辑值,True为匹配,False为不匹配
DimregEXAsObject
SetregEX=CreateObject("VBSCRIPT.REGEXP")'RegEx为建立正则表达式
regEX.Global=True'设置全局可用
regEX.Pattern=sPatrn'设置样式
regEX.IgnoreCase=IC'设置是否区分大小写。
ExTest=regEX.Test(sStr)'执行搜索测试
SetregEX=Nothing
EndFunction
PublicSub去重复()
Dimss,re,rv
ss="Isisthecostofofgasolinegoingupup?
."&vbNewLine
Setre=NewRegExp
re.Pattern="\b([a-z]+)\1\b"
re.Global=True
re.IgnoreCase=True
re.MultiLine=True
rv=re.Replace(ss,"$1")
MsgBoxrv
EndSub
FunctionRegExpTest(patrn,strng)
'正则表达式(RegExp)对象
'提供简单的正则表达式支持功能?
'下面的代码说明了RegExp对象的用法:
DimregEX,match,matches'建立变量。
SetregEX=NewRegExp'建立正则表达式。
regEX.Pattern=patrn'设置模式。
regEX.IgnoreCase=True'设置是否区分字符大小写。
regEX.Global=True'设置全局可用性。
Setmatches=regEX.Execute(strng)'执行搜索。
ForEachmatchInmatches'遍历匹配集合。
retStr=retStr&"Matchfoundatposition"
retStr=retStr&match.FirstIndex&".MatchValueis'"
retStr=retStr&match.Value&"'."&vbCrLf
Next
RegExpTest=retStr
EndFunction
'Global属性
'设置或返回一个Boolean值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。
'Object.Global[=True|False]
'对象参数总是RegExp对象。
如果搜索应用于整个字符串,Global属性的值为True,否则其值为False。
默认的设置为False。
'下面的代码说明了Global属性的用法(改变赋予Global属性的值并观察其效果):
FunctionRegExpTest1(patrn,strng)
DimregEX,match,matches'建立变量。
SetregEX=NewRegExp'建立规表达式。
regEX.Pattern=patrn'设置模式。
regEX.IgnoreCase=True'设置是否区分字母的大小写。
regEX.Global=True'设置全程性质。
Setmatches=regEX.Execute(strng)'执行搜索。
ForEachmatchInmatches'重复匹配集合
retStr=retStr&"Matchfoundatposition"
RetStr=RetStr&Match.FirstIndex&".MatchValueis'"
RetStr=RetStr&Match.Value&"'."&vbCRLFNext
RegExpTest=retStr
EndFunction
'IgnoreCase属性
'设置或返回一个Boolean值,指明模式搜索是否区分大小写。
'Object.IgnoreCase[=True|False]
'Object参数总是一个RegExp对象。
如果搜索是区分大小写的,则IgnoreCase属性为False;否则为True。
缺省值为False。
'说明
'下面的代码说明了IgnoreCase属性的用法(改变赋予IgnoreCase属性的值以观察其效果):
FunctionRegExpTest2(patrn,strng)
DimregEX,match,matches'建立变量。
SetregEX=NewRegExp'建立正则表达式。
regEX.Pattern=patrn'设置模式。
regEX.IgnoreCase=True'设置不区分大小写。
regEX.Global=True'设置全局可用性
Setmatches=regEX.Execute(strng)'执行搜索。
F
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EXCEL VBA 正则表达式 从实例开始 正则 表达式 实例 开始
![提示](https://static.bdocx.com/images/bang_tan.gif)