最近更新:'2019-04-20'
1.正则表达式、文字、元字符
2.贪婪与懒惰搜索、字符类、分组等
2.正则表达式替换内容
1.正则表达式、文字、元字符
正则表达式是字符串(文本)的结构
案例1:
从以下文件找到所有的电话号码.

解决方案
-
首先确定数字的结构特征
-
用word的查找功能,通过用正则表达式表达数字的结构特征进行查找.
案例2:
从以下文件找到所有的电话号码,并且将电话号码后4位数更改为xxxx,起到保密的作用.

用word的替换功能,,通过用正则表达式表达数字的结构特征进行替换.


注意事项:

1.1正则表达式重复结构





1.2指代特定内容的元字符



2.贪婪与懒惰搜索、字符类、分组等
案例1
想找出一下文字中的加号计算( 3+5 2+7).具体文字如下:
在VBA中,运算符与平时我们手写的算术符
号几乎相同,比如:3+5 2+7
以及5*3 6*4 等等。不过除此之外,还有一
些特殊的运算符,比如反斜线\,代表整除
操作,比如:5\3,9\4等等。
在正则表达式测试器写上
\d\+\d

案例2
想找出一下文字中的除法计算( 5\3 9\4).具体文字如下:
在VBA中,运算符与平时我们手写的算术符
号几乎相同,比如:3+5 2+7
以及5*3 6*4 等等。不过除此之外,还有一
些特殊的运算符,比如反斜线\,代表整除
操作,比如:5\3,9\4等等。
在正则表达式测试器写上
\d\\\d






案例3
将以下带有转或接这样的电话号码提取出来.
024-84016733 010+65825901
010-43638193 400转71380726
024转60434942 010+87330711
010转73670432 400-12341234
023接54681804 400#60846786
400+63292216 800接84905011
021-83310410 400-80564466
024+59945574 023转81342973
800#80008000 024转87290359
在正则表达式测试器写上
\d{3}[转接]\d{8}
结果如下:

案例4
将以下带有(转,接,+,#)符合的电话号码提取出来.
024-84016733 010+65825901
010-43638193 400转71380726
024转60434942 010+87330711
010转73670432 400-12341234
023接54681804 400#60846786
400+63292216 800接84905011
021-83310410 400-80564466
024+59945574 023转81342973
800#80008000 024转87290359
在正则表达式测试器写上
\d{3}[转接+#]\d{8}
或者
\d{3}[^-\d{8}
结果如下:







3.外部对象、RegExp、捕获组、替换
3.1RegExp介绍


直接引用不属于excel的VBA语言会报错.对于这种不属于excel的VBA语言,则称为外部对象.

3.2外部对象介绍

使用外部对象,必须要引用Object数据类型,必须声明如下:
Dim myReg As Object
myReg是代表一个对象,但不确定是什么类型的对象.比如正则表达式对象.

因此需要给myReg指定一个具体的对象类型.在VBA需要增加一行代码,如下:
Set myReg = CreateObject("vbscript.regexp")
关于CreateObject函数的介绍,具体如下:

3.3正则表达式的测试
一般正则表达式的捕获是通过正则表达式测试工具进行测试(正则表达式的测试软件),测试结果语法没有问题,再将正则表达式放入到VBA.
首先我们对里面的数据进行正则表达分析,具体如以下截图:

对正则表达式进行测试.
\s*\S+电话\s*\d+[-#]\d+
测试结果没有任何的问题,具体截图如下:

3.4正则表达式的属性
3.4.1 RegExp.Pattern


如果正则表达式里面也需要一个双引号,则在语句里面再加一个双引号,具体案例如下:

3.4.2 RegExp.Global


3.4.3 RegExp.Execute

3.4.4 Matches对象以及Match对象
Matches对象相当于所有的查询结果.而Match对象相当于单个查询结果.

需要增加2行代码
Dim myMatches As Object, myMatch As Object
Set myMatches = myReg.Execute(s)

通过Matches.Count属性获取查询结果,除了用Matches.Count属性,还可以通过for each in的方式获取查询结果.

提取的号码写入到单元格中

VBA的正则表达式与正则表达式测试器类比

那么如何将姓名以及电话分别提取出来呢?
增加一个()即可




3.4.5用正则表达式实现高级替换

$n代表第n个圆括号中捕获的内容
如果替换的内容是$1:$2,那么这又代表什么意思呢?

替换后的结果如下:

那么如何用vba对查询的内容进行替换呢?


注意事项,如下:

网友评论