EXCEL VBA 正那么表达式 从实例开始.docx

上传人:b****4 文档编号:4166006 上传时间:2022-11-28 格式:DOCX 页数:32 大小:25.87KB
下载 相关 举报
EXCEL VBA 正那么表达式 从实例开始.docx_第1页
第1页 / 共32页
EXCEL VBA 正那么表达式 从实例开始.docx_第2页
第2页 / 共32页
EXCEL VBA 正那么表达式 从实例开始.docx_第3页
第3页 / 共32页
EXCEL VBA 正那么表达式 从实例开始.docx_第4页
第4页 / 共32页
EXCEL VBA 正那么表达式 从实例开始.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

EXCEL VBA 正那么表达式 从实例开始.docx

《EXCEL VBA 正那么表达式 从实例开始.docx》由会员分享,可在线阅读,更多相关《EXCEL VBA 正那么表达式 从实例开始.docx(32页珍藏版)》请在冰豆网上搜索。

EXCEL VBA 正那么表达式 从实例开始.docx

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'设

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1