VBA正则表达式入门与提高整理.docx

上传人:b****3 文档编号:10241195 上传时间:2023-05-24 格式:DOCX 页数:75 大小:486KB
下载 相关 举报
VBA正则表达式入门与提高整理.docx_第1页
第1页 / 共75页
VBA正则表达式入门与提高整理.docx_第2页
第2页 / 共75页
VBA正则表达式入门与提高整理.docx_第3页
第3页 / 共75页
VBA正则表达式入门与提高整理.docx_第4页
第4页 / 共75页
VBA正则表达式入门与提高整理.docx_第5页
第5页 / 共75页
VBA正则表达式入门与提高整理.docx_第6页
第6页 / 共75页
VBA正则表达式入门与提高整理.docx_第7页
第7页 / 共75页
VBA正则表达式入门与提高整理.docx_第8页
第8页 / 共75页
VBA正则表达式入门与提高整理.docx_第9页
第9页 / 共75页
VBA正则表达式入门与提高整理.docx_第10页
第10页 / 共75页
VBA正则表达式入门与提高整理.docx_第11页
第11页 / 共75页
VBA正则表达式入门与提高整理.docx_第12页
第12页 / 共75页
VBA正则表达式入门与提高整理.docx_第13页
第13页 / 共75页
VBA正则表达式入门与提高整理.docx_第14页
第14页 / 共75页
VBA正则表达式入门与提高整理.docx_第15页
第15页 / 共75页
VBA正则表达式入门与提高整理.docx_第16页
第16页 / 共75页
VBA正则表达式入门与提高整理.docx_第17页
第17页 / 共75页
VBA正则表达式入门与提高整理.docx_第18页
第18页 / 共75页
VBA正则表达式入门与提高整理.docx_第19页
第19页 / 共75页
VBA正则表达式入门与提高整理.docx_第20页
第20页 / 共75页
亲,该文档总共75页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

VBA正则表达式入门与提高整理.docx

《VBA正则表达式入门与提高整理.docx》由会员分享,可在线阅读,更多相关《VBA正则表达式入门与提高整理.docx(75页珍藏版)》请在冰点文库上搜索。

VBA正则表达式入门与提高整理.docx

VBA正则表达式入门与提高整理

VBA正则表达式入门与提高(word版可编辑修改)

编辑整理:

 

尊敬的读者朋友们:

这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(VBA正则表达式入门与提高(word版可编辑修改))的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为VBA正则表达式入门与提高(word版可编辑修改)的全部内容。

VBA则表达式入门与提高

有一位美国佬编写的〈〈精通正则表达式〉>专业书籍是世人公认的正则权威著作。

但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者。

其中很多晦涩难懂的内容在VBA中用不上或者对你来说根本无用的,而初学者的你却根本不知道怎样取舍。

事实上,本人还没有发现一本针对VBA平台的正则专业书籍.网络可见到少量VBA正则教程,但内容多是"点到为止”。

鉴于此,有此贴文.在这里感谢本论坛liucqa老师的鼓励,在之前本人写过一篇正则对象操作的短文,liucqa老师留贴建议多写一点,但一致未能成文。

此帖算是对liucqa老师的交代。

内容提要

顺利迈越初期学习正则障碍的最好方法是:

首先鸟览正则的全貌,在头脑中建立正则地图的概貌,然后”按图索骥"描绘充实每个细节.

“基础篇”的第一章希望为你构建一个正则体系的"地图“轮廓。

第二章详细解读了正则在VBA中的实现(即正则对象的操作)。

第三至第六章分类介绍VBA中可使用的全部元字符(序列).它相当于VBS程序员手册中的正则内容范围.但充实了更多在实践中会遇到的细节

“元字符进阶篇",讨论了元字符的应用环境以及对若干个常用元字符(序列)的深入辨析和应用探索。

“原理篇":

正则表达式工作原理是最重要同时也是最难以掌握的知识.研究这个问题有时的确很枯燥,然而弄懂正则表达式的工作原理,才是真正理解正则的关键。

正则工作原理可以让你根据任务编制出正确高效的正则表达式,也可以帮助你理解别人编写的正则表达式,另外也帮你分析”为什么是这个匹配结果?

"的真正原因,从而更精准地调较正则表达式。

“技巧篇”:

不要指望背诵单词和掌握语法就可以写出漂亮的文章.掌握正则的方法也是需要大量阅读与实践的,本篇提供了一些现实世界的实例,供你参考和探讨。

望它能给你一些编制正则表达式的灵感。

第一篇 基础篇

一、正则表达式概论—理解正则表达式

二、正则表达式与VBA的交互—正则表达式的实现

三、正则元字符—字符的表示法

四、正则元字符-数量的表示法

五、正则元字符—位置的表示法

六、正则元字符-分组及控制表示法

第二篇 进阶篇

一、元字符与字符集

二、^$的位置到底是哪里

三、字符组内部元字符转义规则

四、字符组与多选结构“|”

五、否定环视与否定字符组

六、顺序环视的多角度理解与应用

第三篇 原理篇

一、匹配的基本术语

二、匹配总原则

三、正则表达式匹配的基本过程

四、回溯

五、回溯的总结

六、回溯与效率

七、灾难回溯

第四篇 技巧篇

一、匹配具有多种形态结构的字符串

二、匹配特定位置上的字符串

三、匹配其内部由相似结构字符串构成的字符串

四、在一大段文本中,匹配一对特定字符串之间的字符串

五、匹配一对特殊字符界定的之间的字符串,但其内部包含两端的界定字符

第一篇 基础篇

一、正则表达式概论-——-理解正则表达式

文本处理是一项常见的工作任务,比如:

在一段文本或数据中,查找、替换、提取、验证、分离和删除等特定字符或字符串.在几乎所有文本编辑器中(如word/excel/VBE等)都提供了字符串的查找/替换功能;在编程语言的世界里更是提供了丰富的字符处理函数和方法.VBA中有Find(查找某字符串)、Replace(用一字符串去替换文本中的另一字符串)、LIke(判断某字符串是否存在)等等。

编程语言本身提供的字符处理函数或方法,具有用法简单、处理快速和使用便捷的特点。

不过这些函数或方法也存在很大缺陷:

它们通常都是对非常具体的字面文字进行操作,假如要处理某一类具有某些相似特征的字符或字符串,就显得力不从心了.举个例子,要求在一大段文本中,查找所有的符合规范的电子邮箱。

如果用VBA本身提供的字符处理函数来处理,显然不是一件容易的事。

可见,在现实的世界里对复杂动态文本的处理,仅靠编程语言本身是不够的。

为此,人们找到了一种功能更为强大的文本处理解决方案--——正则表达式方案。

正则表达式是强大、便捷、高效的文本处理工具。

利用它使用者可以描述和分析任何复杂的文本,配合编程语言或文本编辑器提供的支持,正则表达式能够查找、替换、提取、验证、添加、删除、分离和修整各种类型的文本和数据.当今主流编程语言(如:

java/C#/C++/.net/php/pcre/perl等)几乎都提供了对正则表达式的支持;有些文本编辑器(如Dreamweaver)在编辑查找框中也可直接输入正则表达式,实现不限于字面文字的搜索与替换.VBA虽然只是对正则提供简单支持,但是它也可以完成一些用VBA函数或方法难以处理的文本处理任务.

(一)正则表达式方案处理文本的基本思路

1、显然,无论进行何种文本处理操作,首先要在目标文本中找出指定的字符串,而要查找它们必须得描述出该字符串的特征。

比如,你要验证用户输入的是否是一个正确的电子邮箱,肯定不可能去枚举世界上所有存在的电子邮箱,因而首先得依据电子邮箱规范,建立一个电子邮箱的模式,然后比照该模式到文本中去查找验证,从而判断目标文本中是否存在与模式相吻合的字符串(这个过程也称之匹配过程,查找到的结果叫”匹配”)。

一个简单的电子邮箱模式可以表示为:

^\S+@\S+$

这个代码模式就是电子邮箱的正则表达式,所以正则表达式是一种可以在许多现代应用程序和编程语言中使用的特殊形式的代码模式。

编制这样的代码模式,也就是编制正确高效的正则表达式,是我们学习和研究正则表达式的主要任务.

2、如何将编制好的正则表达式应用于编程语言,实现我们真正的需要,这是学习和使用正则的第二个问题,在这一点上,不同的编程语言其实现方式是不一样的.庆幸的是,较之编制正则表达式,掌握它们是非常简单的事。

我们会在本篇的第二章“正则与VBA的交互”中详细论述.

(二)正则表达式的基本组成单元—元字符(序列)

从电子邮箱的正则表达式(^\S+@\S+$)可以看到,正则表达式是由一些”特殊字符”组成的.人们常常把这些组成正则表达式的”特殊字符”称之为元字符。

元字符是正则表达式事先规定或约定的,用来表示字符、位置、数量和控制的专用符号。

在组成正则表达式的元素中,有的是由两个或多个特殊字符组成一个单元,表示单一意义.如上面电子邮箱正则中,”\S”表示一个非不可见字符,我们可以称之为元字符序列。

在正则表达式中也可以有字面字符,如邮箱正则的字符“@”,在这时表示的是字面上"@”.所以从形式上观察,正则表达式是由元字符、元字符序列或字面字符组成的,用于描述字符或字符串特征的一个代码模式。

正则表达式也可以仅由字面字符组成,如"正则ABC”。

你是否有一种似曾相识的感觉?

对!

这不是什么新鲜的想法。

远古的DOS时代,前辈门就曾用*号代表任意多个字符,用?

号代表一个任意字符,那时称之为“通配符”;当下的VBA中Like函数的参数里有更多的特殊字符或结构,用来描述字符或字符串模式.不过,正则表达式里,那些”特殊字符"更多,语法规则更丰富,可以认为,它相当于是一门”微型”语言.

接下来,本章会把所有的”元字符(序列)"分类展示给你,不是要你立马记住或掌握它,目的是让你有个概貌,避免在以后的学习中迷失方向。

1.正则表达式规定了多种方法或符号用来表示世界各国使用的文字字符。

如:

 

下面列举了VBA中正则表示字符的所有元字符(序列),在以后的章节中会详细介绍。

(1)常用不可打印字符:

\n、\t、\f、\r、\v

(2)八进制转义:

\num(num是一个八进制数)

(3)十六进制转义:

\xnum(num是一个十六进制数)

(4)Unicode转义:

\unum(num是unicode代码点)

(5)控制字符:

\cchar(char是A-Z之间的任意字母)

(6)普通字符组:

[a—z]和[^a—z]

(7)几乎能匹配任何字符的元字符:

英文句点

(8)字符组缩略表示法:

\w、\d、\s、\W、\D、\S

2。

表示字符或字符串数量(连续出现的次数)的元字符:

*、?

、+、{n}、{n,m}例:

 

3.表示位置的元字符(序列):

^、$、\b、\B、(?

=…)、(?

!

...)例:

 

4。

在正则表达式中起分组、捕获和控制作用的元字符(序列):

(…)、(?

:

…)、\1、…|…|…、*?

、+?

、?

?

、{num,num}?

例:

捕获9。

PNG (22.65KB,下载次数:

7)

捕获.PNG (22.47KB,下载次数:

4)

(三)用正则处理文本的一个例子

我们已经认识了几个简单的元字符(序列),并能用它们构建一些实用的正则表达式,那么,怎样把它们应用于VBA中呢?

,下面我们用正则在VBA中来完成一个简单的任务:

目标文本:

”正则表达式其实很简单“

任务:

删除目标文本中行尾空格。

分析:

1.\s可表示空格,+表示出现一个或多个字符,所以可用”\s+”表示连续多个空格。

$表示一行的行尾,于是可用以下正则表达式描述行尾的若干空格:

\s+$

2。

我们把上面的正则代码表达式作用于目标文本,查找与模式吻合的字符(串),并用空字符替换,从而达成实现删除空格任务.

下面是完整的VBA代码:

SubTest()

Dimregx,S$,Strnew$

S="正则表达式其实很简单"

Setregx=CreateObject(”vbscript。

regexp")

regx。

Pattern="\s+$”

regx.Global=True

Strnew=regx.Replace(S,"")

MsgBoxStrnew

EndSub

这个简单的例子说明了正则实现的一般步骤:

1、创建变量:

这个例子中,变量regx是一个对象,S是字符串变量;Strnew也是字符串变量。

2、把目标文本赋值给变量S

3、创建一个正则对象regx

4、设置正则对象regx的pattern属性,即把正则表达式以字符串形式赋值给pattern。

5、设置正则regx对象的其它属性,例子中设置Global属性为真

6、应用对象提供的方法,实现相应功能。

例子中,利用regx对象的Replace方法实现替换.

7、输出处理后的字符串.

到这里,你已经完全了解了用正则处理文本的基本过程和思路,以及在VBA中使用正则的代码框架。

以后的任务是全面掌握正则的所有元字符和它们的工作原理,另外还需要进一步了解正则对象的各种属性和方法。

要提醒的是,”基础篇”的应用实例或许并不是解决该任务的最佳方案,也或许是一些看似很无聊的例子,但请不要忽视它们.正是透过这些简单的实例,揭示了概念的本质。

二。

正则与VBA的交互-正则表达式的实现

在继续学习正则元字符特性或编制自己的正则表达式时,常常需要对其测试。

你可以用一些专门的正则测试工具(推荐RegxBuddy);也可以自己编制VBA代码进行测试。

不过建议初学者,经常编写VBA代码进行测试,这样可以提高今后实际应用正则的能力。

所以,在进一步学习正则元字符特性之前,我们先介绍正则与VBA的交互的相关知识.你可以快速阅读或越过本章内容,在以后具体应用时,再经常回头查阅。

当然也可以用上一章学到的知识详细研究本章内容,在以后的学习中专注于正则表达式本身。

用正则处理文本,是通过正则表达式与程序设计语言的交互来实现的。

其交互方式在不同编程语言中分为三大类:

一是集成式.Perl语言本身内建正则操作符,可以直接作用于正则表达式。

操作符作用于正则表达式就像数学的+-号作用于数字一样.不需要构建正则对象。

例如:

任务是要把变量$text保存的文本中的空行替换为标签(

)。

正则表达式

^$表示空行。

在Perl语言中,可以用一句代码实现替换:

$text=~s/^$/〈p〉/g

二是函数式处理。

Java等语言,为正则处理提供了一些便捷函数,以节省工作量。

用户不需要首先创建一个正则对象,而是用静态函数提的临时对象来完成正则处理,处理完后把临时对象抛弃。

 正则表达式对于函数相当于一个参数,这种方式的优点是”随手"可用,但不适宜在对时间要求很高的循环中使用.所以java也提供了下面讲到的面向对象的程序式处理。

三是面向对象的程序式处理.这是大多数编程语言的正则处理方式。

VBA平台采用的也是这种方式。

面向对象的程序式处理方式,首先必须创建一个正则对象的实例,然后设置对象必要的属性,最后用对象的方法来完成指定的任务。

(提示:

不同编程语言的正则对象具有的属性和方法,其项目多少或功能强弱有所不同,所以,在VBA中使用正则如果发现没有某种其它语言的方法或属性,请不要感到困惑)

在上一章中,我们给出了一个用VBA删除行尾空格的正则处理例子,它代表了一般的代码框架模式,下面再看一看它的结构特点,并对每一部分的代码段进行剖析:

Subtest()

Dimregx,S$,Strnew$1.定义变量代码段

S=”正则表达式其实很简单“2.目标文本字串变量赋值代码段

Setregx=createobject(“vbscript。

regexp”)3.创建正则对象代码段

Regx.pattern=”\s+$”4.设置正则对象的pattern属性代码段

Regx.global=true5。

设置正则对象的其它属性代码段

Strnew=regx。

replace(s,””)6。

应用正则对象方法代码段

Msgboxstrnew7.处理返回值代码段

Endsub

1。

定义变量代码段

不必讲解了吧.

2。

目标文本字符串赋值代码段

目标文本,可能存在于文本文档、Word文档、HTML文档或Excel文档等文档之中.正则对象并不能直接作用于这些文档,只能作用于它们的副本。

所以用VBA正则处理这些文档,必须首先从这些文档中读出字符串并赋值于字符变量。

如果任务是修改文本,那么,你可能需要编写额外的代码将修改后的文本字符串重新写回原文档中.

例:

假如目标文本存在于当前表格A1单元格中。

可使用下列代码赋值于字符变量S

S=Activesheet.[a1]

目标文本也可能分别存在于一个数组中,那么,你可能需要通过循环逐一处理.

你也可以直接以输入的方式,赋值给字符变量,就像上面的例子。

这时特别注意的是:

半角双引号是VBA语言中的保留字符,如果目标文本中本身含有半角双引号,则必须转义,转义方法是:

用重复的双引号表示一个双引号。

例:

目标文本为:

”我们用”汗牛充栋"、”学富五车”形容一个人读的书、拥有的知识多。

”.

将之赋值给S的代码为:

S=”我们用”"汗牛充栋”"、””学富五车"”形容一个人读的书、拥有的知识多.”

3。

创建正则对象代码段

文本处理的各种操作,都是通过操作正则对象来完成的.所以必须创建正则对象.VBA创建或声明正则对象有两方式:

早期绑定和后期绑定,你可以根据自己喜好选择其一:

早期绑定:

(需要在VBE-—工具--引用中勾选MicrosoftVBScriptRegularExpressions5.5)

DimregxASRegExp

Setregx=newregexp(或dimregxasnewregexp)

后期绑定:

 

Setregex=CreateObject("VBScript。

RegExp")

利用上述两种方式创建或声明正则对象,实际上是调用MicrosoftVBScript脚本的regexp正则对象。

MicrossoftVBScript脚本,包含在InternetEeplorer5。

5以及之后的版本中.该脚本中的正则表达式执行的是ECMA—262第3版所规定的标准,与JavaScript脚本中的正则执行标准是相同的。

1。

0版只是为了向后兼容的目的,功能很弱。

(提示:

在VBA中也可调用JavaScript(Jscript)或ruby等脚本中的正则对象,Jscript的元字符及特性与VBscript是一样的,但它的方法或属性要多一点,或者说对正则的支持更强一些。

ruby本人不懂,不太了解它的元字符集,只是看到论坛上有人使用)

4。

设置对象的pattern属性

语法:

object.pattern=”正则表达式"

Object是一个正则对象。

把自己编制的正则表达式,以字符串的形式赋值给pattern属性。

注意要用英文双引号将正则表达式包围起来。

并且要在对象名与属性名之间用英文点号隔开.属性名pattern是保留字,固定不变的,对象名是用户自定义的。

接下来的两个步骤是对正则对象的操作,通过设置或使用正则对象的属性和方法,以实现对文本的处理。

正则对象的属性和方法不多,列表于下:

 

5。

设置对象的其它属性

除Pattern属性外,正则对象还有其它三个属性,其属性值有False和True,默认值都是False。

如果要使用默认属性,可以不用显示设置;如果要改变默认属性,则需要显示设置:

Global当属性值为False时,只要在目标文本中,找到一个匹配时,即停止搜索。

如果想要找出目标文本中的所有匹配,那么需要把它的属性值设置为True。

IgnoreCase设置对英文字母大小写是否敏感。

默认值False,对大小写敏感;设置为True,忽略大小写。

MultiLine它影响且只影响元字符^和$的意义。

值为False,无论目标文本是多少行,整个文本中则只有一个开始位置,^表示第一行的开始;只有一个行结束位置,$表示文本末尾位置。

值为True,那么,^和$分别表示每一行的行首和行尾位置。

下面来完成一个简单的任务,再具体认识各属性的使用方法:

有一两行的文本:

Aaa

Bbb

任务要求:

1.在文本开始和结束处,分别插入一个”@”符号;

2.在文本每行的开始和行尾分别插入”@"符号.

正则表达式:

^|$表示匹配行开始或结束位置

任务1代码:

Subtest1()

Dimreg,s$

s="Aaa"&vbLf&”bbb"'这里用vblf表示行之间的换行符

Setreg=CreateObject("vbscript。

regexp”)

reg.Pattern="^|$"

reg.Global=True

s=reg。

Replace(s,”@")

MsgBoxs

EndSub

讨论:

Msgbox最后显示的结果为:

@Aaa

Bbb@

代码中修改了global的默认属性值,设置为true;目的是保证能找到并替换全部的开始或结束位置.如果保持默认属性,则只会在开始处插入一个@号。

正则对象Reg的其它两个属性保持为默认.因为本任务无关乎字母大小问题,所以IgnoreCase属性无需要设置为Ture(当然如果设置为true,对最后结果也无影响);由于Mutiline属性保持默认,其值为False,所以整个文本只有一个开始位置和一个结束位置。

代码中使用了对象reg的replace方法,它的作用是,将在目标文本中找到的匹配(开始和结束位置)替换为”@"字符,在这里实际上是插入。

然后把修改后的文本返回,重新赋值给字符变量S。

任务2代码:

Subtest2()

Dimreg,s$

s=”Aaa”&vbLf&"bbb"

Setreg=CreateObject(”vbscript.regexp")

reg.Pattern=”^|$"

reg。

Global=True

reg。

MultiLine=True

s=reg.Replace(s,”@”)

MsgBoxs

EndSub

讨论:

任务2代码与任务1代码唯一区别是修改了mutiline默认属性,设置为True。

这就意为着,该文本的每一行都存在一个开始位置和结束位置。

所以Msgbox最后显示的结果为:

@Aaa@

@Baa@

6.应用对象的方法代码段

VBScirpt正则对象的方法共有三个:

你可以根据任务要求选择使用一个或多个方法。

(1)TEST方法

语法:

Object.Test(string)

Test方法只是简单测试目标文本中,是否包含正则表达式所描述的字符串.如果存在,则返回True,否则返回False。

例:

用代码检测用户的输入是否是一个电子邮箱。

SubChkEmail()

Dimreg,s$

s=InputBox("请输入一个电子邮箱:

”)

Setreg=CreateObject(”vbscript。

regexp”)

reg.Pattern="^\S+@\S+$"

Ifreg.Test(s)Then

MsgBox"你输入的电子邮箱格式正确:

”&s

Else

MsgBox”你输入的电子邮箱格式不正确!

EndIf

EndSub

讨论:

代码从用户那里获得字符串,然后赋值与字符变量S。

验证邮箱的正则表达式非常简略,元字符序列"\S"表示不是空格的任意一个字符,后面紧跟一个+号表示一个以上字符。

这个表达式事实上只验证了用户的输入里,在字符串之间是否有一个@符号。

它甚至认为”0@中"都是正确的.下面给出一个更为严格的电子邮箱正则表达式:

“^[\w.—]+@[\w.—]+$”当然要严格按电子邮箱规范写出正则表达式,可能就十分复杂,由于我们刚刚接触正则,就不在详细讨论了.

这里要关注的是,test方法的语法,在方法与正则对象之间也是用英文点号隔开,作为参数,目标字符串用英文括号包围.在这个例子中,如果Test返回的是true,表示目标文本S中找到了正则模式的匹配。

则显示正确结果,否则显示错误提示。

(2)Replace方法

替换在目标文本中用正则表达式查找到的字符串。

前面例子中语句体现其语法:

s=reg。

replace(s,"@”)

后面括号中的参数S,代表前面代码中设置的目标文本字符串.也就是正则表达式将要作用的目标文本。

”@”是用来替换的字符串参数。

前面的s是Replace方法返回的结果,它是目标文本被替换后的一个副本。

如果没有找到匹配的文本,将返回与目标文本一样的一个副本。

下面继续讨论Replace方法的第二个参数:

例子中”@"是一个字面字符,要用一对双引号包围起来。

第二个参数还可以是变量、表达式。

如果是变量或函数则不能用双引号包围,这一点和VBA代码规则是一致的.

上一章我们知道了如果在正则表达式中使用了元字符序列()括号,那么被圆括号包围的内容会存储在特殊变量$1中。

在有些编程语言中,可以直接在正则代码外使用$1变量,而VBScript中可以并只可以在Replace方法中,作为第二参数来调用。

例子:

在目标文本中的数字数据后增加上单位:

KG

目标文

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2