版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录目录1正则表达式入门与提高1内容提要2第一篇基础篇4一、正则表达式概论-理解正则表达式4(一)正则表达式方案处理文本的基本思路4(二)正则表达式的基本组成单元元字符(序列)5(三)用正则处理文本的一个例子7二.正则与VBA的交互正则表达式的实现81.定义变量代码段92.目标文本字符串赋值代码段93.创建正则对象代码段94.设置对象的pattern属性105.设置对象的其它属性106.应用对象的方法代码段12三.正则元字符-字符表示法20(一)对于一些常用的不可打印字符,规定了专用的元字符序列20(二)普通字符组:肯定字符组a-z及否定字符组a-z21(三)字符组缩略表示法21(四)几乎能匹
2、配任何字符的元字符:英文句点22(五)控制字符表示法:cChar22(六)ASCII码表中字符的八进制转义表示法:num22(七)ASCII码表中字符的十六进制转义表示法: xnum23(八)Unicode码表中字符的十六进制转义表示法:unum23(九)元字符字面字符表示法:转义符”23(十)引用前面括号捕获的文本反向引用24四.正则元字符-字符(串)连续出现次数表示法25五.正则元字符-字符(串)位置表示法27(一)单词分界符b28(二)非单词边界B29(三)肯定顺序环视与否定顺序环视29第二篇元字符(序列)进阶篇34一、元字符与字符集34二、$的位置到底在哪里35三、字符组中元字符转义规
3、则36四、字符组与多选结构”|”36五、否定顺序环视与否定字符组37六、环视的多角度理解与应用38(一)用作锁定特定位置的文本字符串38(二)用作对特定字符串是否存在的判断39第三篇正则匹配的工作原理41一、匹配的基本术语411. 匹配412. 正则”引擎”413. 引擎”眼”中的目标文本位置和字符414. 子表达式42二、匹配总原则42三、正则表达式匹配的基本过程421. 在正则制导下,引擎从目标文本的开始处,依次进行匹配尝试.422. 引擎依次在目标文本的每一个位置上,尝试整个正则表达式中的所有子表达和组成元素,直到匹配失败,才移动到下一个位置.433. 匹配优先量词总是匹配尽可多的字符4
4、44. 忽略优先量词总是匹配尽可能少的字符45四、穷尽所有可能途径找到匹配-回溯46(1)多选结构的回溯46(2)量词”?”的回溯47(3)量词”*”的回溯48五. 回溯的总结48六. 回溯与效率49七.灾难回溯50第四篇 技巧篇52一. 匹配具有多种形态结构的字符串521. 匹配下列文本中的标签,它可能呈现的形式例举如下:522. 匹配浮点数,它可能有下列几种呈现形式:533. 匹配某范围内的数据53讨论:54二、匹配特定位置上的字符串54三、匹配其内部由相似结构字符串构成的字符串56四、匹配一段文本,这段文本中不能包含特定字符串58五、匹配一对特殊字符界定的之间的字符串,但其内部包含两端的
5、界定字符59例1目标文本59例2目标文本60讨论:62结束语63VBA则表达式入门与提高 有一位美国佬编写的专业书籍是世人公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在VBA中用不上或者对你来说根本无用的,而初学者的你却根本不知道怎样取舍.事实上,本人还没有发现一本针对VBA平台的正则专业书籍.网络可见到少量VBA正则教程,但内容多是”点到为止”. 鉴于此,有此贴文.在这里感谢本论坛liucqa老师的鼓励,在之前本人写过一篇正则对象操作的短文,liucqa老师留贴建议多写一点,但一致未能成文.此帖算是对liucq
6、a老师的交代.内容提要 顺利迈越初期学习正则障碍的最好方法是:首先鸟览正则的全貌,在头脑中建立正则地图的概貌,然后”按图索骥”描绘充实每个细节. “基础篇”的第一章希望为你构建一个正则体系的地图“轮廓.第二章详细解读了正则在VBA中的实现(即正则对象的操作).第三至第六章分类介绍VBA中可使用的全部元字符(序列).它相当于VBS程序员手册中的正则内容范围.但充实了更多在实践中会遇到的细节 “元字符进阶篇”,讨论了元字符的应用环境以及对若干个常用元字符(序列)的深入辨析和应用探索. “原理篇”:正则表达式工作原理是最重要同时也是最难以掌握的知识.研究这个问题有时的确很枯燥,然而弄懂正则表达式的工
7、作原理,才是真正理解正则的关键.正则工作原理可以让你根据任务编制出正确高效的正则表达式,也可以帮助你理解别人编写的正则表达式,另外也帮你分析”为什么是这个匹配结果?”的真正原因,从而更精准地调较正则表达式. “技巧篇”:不要指望背诵单词和掌握语法就可以写出漂亮的文章.掌握正则的方法也是需要大量阅读与实践的,本篇提供了一些现实世界的实例,供你参考和探讨.望它能给你一些编制正则表达式的灵感.目录第一篇基础篇一、 正则表达式概论理解正则表达式二、 正则表达式与VBA的交互正则表达式的实现三、 正则元字符字符的表示法四、 正则元字符数量的表示法五、 正则元字符位置的表示法六、 正则元字符分组及控制表示
8、法第二篇进阶篇一、 元字符与字符集二、 $的位置到底是哪里三、 字符组内部元字符转义规则四、 字符组与多选结构“”五、 否定环视与否定字符组六、 顺序环视的多角度理解与应用第三篇原理篇一、匹配的基本术语二、匹配总原则三、正则表达式匹配的基本过程四、回溯五、回溯的总结六、回溯与效率七、灾难回溯第四篇技巧篇一、匹配具有多种形态结构的字符串二、匹配特定位置上的字符串三、匹配其内部由相似结构字符串构成的字符串四、在一大段文本中,匹配一对特定字符串之间的字符串五、匹配一对特殊字符界定的之间的字符串,但其内部包含两端的界定字符第一篇基础篇一、正则表达式概论-理解正则表达式 文本处理是一项常见的工作任务,比
9、如:在一段文本或数据中,查找、替换、提取、验证、分离和删除等特定字符或字符串。在几乎所有文本编辑器中(如word/excel/VBE等)都提供了字符串的查找/替换功能;在编程语言的世界里更是提供了丰富的字符处理函数和方法。VBA中有Find(查找某字符串)、Replace(用一字符串去替换文本中的另一字符串)、LIke(判断某字符串是否存在)等等。 编程语言本身提供的字符处理函数或方法,具有用法简单、处理快速和使用便捷的特点。不过这些函数或方法也存在很大缺陷:它们通常都是对非常具体的字面文字进行操作,假如要处理某一类具有某些相似特征的字符或字符串,就显得力不从心了。举个例子,要求在一大段文本中
10、,查找所有的符合规范的电子邮箱。如果用VBA本身提供的字符处理函数来处理,显然不是一件容易的事。可见,在现实的世界里对复杂动态文本的处理,仅靠编程语言本身是不够的。为此,人们找到了一种功能更为强大的文本处理解决方案-正则表达式方案。 正则表达式是强大、便捷、高效的文本处理工具。利用它使用者可以描述和分析任何复杂的文本,配合编程语言或文本编辑器提供的支持,正则表达式能够查找、替换、提取、验证、添加、删除、分离和修整各种类型的文本和数据。当今主流编程语言(如:java/C#/C+/.net/php/pcre/perl等)几乎都提供了对正则表达式的支持;有些文本编辑器(如Dreamweaver)在编
11、辑查找框中也可直接输入正则表达式,实现不限于字面文字的搜索与替换VBA虽然只是对正则提供简单支持,但是它也可以完成一些用VBA函数或方法难以处理的文本处理任务。(一)正则表达式方案处理文本的基本思路 1、显然,无论进行何种文本处理操作,首先要在目标文本中找出指定的字符串,而要查找它们必须得描述出该字符串的特征。比如,你要验证用户输入的是否是一个正确的电子邮箱,肯定不可能去枚举世界上所有存在的电子邮箱,因而首先得依据电子邮箱规范,建立一个电子邮箱的模式,然后比照该模式到文本中去查找验证,从而判断目标文本中是否存在与模式相吻合的字符串(这个过程也称之匹配过程,查找到的结果叫”匹配”)。一个简单的电
12、子邮箱模式可以表示为:S+S+$ 这个代码模式就是电子邮箱的正则表达式,所以正则表达式是一种可以在许多现代应用程序和编程语言中使用的特殊形式的代码模式。编制这样的代码模式,也就是编制正确高效的正则表达式,是我们学习和研究正则表达式的主要任务。 2、如何将编制好的正则表达式应用于编程语言,实现我们真正的需要,这是学习和使用正则的第二个问题,在这一点上,不同的编程语言其实现方式是不一样的.庆幸的是,较之编制正则表达式,掌握它们是非常简单的事。我们会在本篇的第二章“正则与VBA的交互”中详细论述。(二)正则表达式的基本组成单元元字符(序列) 从电子邮箱的正则表达式(S+S+$)可以看到,正则表达式是
13、由一些”特殊字符”组成的。人们常常把这些组成正则表达式的”特殊字符”称之为元字符。元字符是正则表达式事先规定或约定的,用来表示字符、位置、数量和控制的专用符号。在组成正则表达式的元素中,有的是由两个或多个特殊字符组成一个单元,表示单一意义。如上面电子邮箱正则中,”S”表示一个非不可见字符,我们可以称之为元字符序列.在正则表达式中也可以有字面字符,如邮箱正则的字符“”,在这时表示的是字面上”.所以从形式上观察,正则表达式是由元字符、元字符序列或字面字符组成的,用于描述字符或字符串特征的一个代码模式.正则表达式也可以仅由字面字符组成,如”正则ABC”. 你是否有一种似曾相识的感觉?对!这不是什么新
14、鲜的想法.远古的DOS时代,前辈门就曾用*号代表任意多个字符,用?号代表一个任意字符,那时称之为“通配符”;当下的VBA中Like函数的参数里有更多的特殊字符或结构,用来描述字符或字符串模式.不过,正则表达式里,那些”特殊字符”更多,语法规则更丰富,可以认为,它相当于是一门”微型”语言. 接下来,本章会把所有的”元字符(序列)”分类展示给你,不是要你立马记住或掌握它,目的是让你有个概貌,避免在以后的学习中迷失方向.1.正则表达式规定了多种方法或符号用来表示世界各国使用的文字字符。如:下面列举了VBA中正则表示字符的所有元字符(序列),在以后的章节中会详细介绍.(1) 常用不可打印字符:n、t、
15、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、S2.表示字符或字符串数量(连续出现的次数)的元字符:*、?、+、n、n,m 例:3.表示位置的元字符(序列):、$、b、B、(?=)、(?!.)例:4.在正则表达式中起分组、捕获和控制作用的元字符(序列):()、(?:)
16、、1、|、*?、+?、?、num,num?例:捕获9.PNG(22.65 KB, 下载次数: 7)捕获.PNG(22.47 KB, 下载次数: 4)(三)用正则处理文本的一个例子 我们已经认识了几个简单的元字符(序列),并能用它们构建一些实用的正则表达式,那么,怎样把它们应用于VBA中呢?,下面我们用正则在VBA中来完成一个简单的任务: 目标文本:”正则表达式其实很简单 “ 任务:删除目标文本中行尾空格. 分析: 1.s可表示空格,+表示出现一个或多个字符,所以可用”s+”表示连续多个空格.$表示一行的行尾,于是可用以下正则表达式描述行尾的若干空格: s+$ 2.我们把上面的正则代码表达式作用
17、于目标文本,查找与模式吻合的字符(串),并用空字符替换,从而达成实现删除空格任务。 下面是完整的VBA代码:Sub Test() Dim regx, S$, Strnew$ S = 正则表达式其实很简单 Set regx = CreateObject(vbscript.regexp) regx.Pattern = s+$ regx.Global = True Strnew = regx.Replace(S, ) MsgBox StrnewEnd Sub 这个简单的例子说明了正则实现的一般步骤:1、 创建变量:这个例子中,变量regx是一个对象,S是字符串变量;Strnew也是字符串变量.2、
18、把目标文本赋值给变量S3、 创建一个正则对象regx4、 设置正则对象regx的pattern属性,即把正则表达式以字符串形式赋值给pattern.5、 设置正则regx对象的其它属性,例子中设置Global属性为真6、 应用对象提供的方法,实现相应功能.例子中,利用regx对象的Replace方法实现替换.7、 输出处理后的字符串. 到这里,你已经完全了解了用正则处理文本的基本过程和思路,以及在VBA中使用正则的代码框架.以后的任务是全面掌握正则的所有元字符和它们的工作原理,另外还需要进一步了解正则对象的各种属性和方法. 要提醒的是,”基础篇”的应用实例或许并不是解决该任务的最佳方案,也或许
19、是一些看似很无聊的例子,但请不要忽视它们.正是透过这些简单的实例,揭示了概念的本质.二.正则与VBA的交互正则表达式的实现 在继续学习正则元字符特性或编制自己的正则表达式时,常常需要对其测试.你可以用一些专门的正则测试工具(推荐RegxBuddy);也可以自己编制VBA代码进行测试。不过建议初学者,经常编写VBA代码进行测试,这样可以提高今后实际应用正则的能力。所以,在进一步学习正则元字符特性之前,我们先介绍正则与VBA的交互的相关知识。你可以快速阅读或越过本章内容,在以后具体应用时,再经常回头查阅。当然也可以用上一章学到的知识详细研究本章内容,在以后的学习中专注于正则表达式本身. 用正则处理
20、文本,是通过正则表达式与程序设计语言的交互来实现的。其交互方式在不同编程语言中分为三大类: 一是集成式。Perl语言本身内建正则操作符,可以直接作用于正则表达式.操作符作用于正则表达式就像数学的+-号作用于数字一样.不需要构建正则对象。例如:任务是要把变量$text保存的文本中的空行替换为标签()。正则表达式$ 表示空行.在Perl语言中,可以用一句代码实现替换:$text= s/$/g 二是函数式处理。Java等语言,为正则处理提供了一些便捷函数,以节省工作量.用户不需要首先创建一个正则对象,而是用静态函数提的临时对象来完成正则处理,处理完后把临时对象抛弃.正则表达式对于函数相当于一个参数,
21、 这种方式的优点是”随手”可用,但不适宜在对时间要求很高的循环中使用.所以java也提供了下面讲到的面向对象的程序式处理. 三是面向对象的程序式处理。这是大多数编程语言的正则处理方式。VBA平台采用的也是这种方式。面向对象的程序式处理方式,首先必须创建一个正则对象的实例,然后设置对象必要的属性,最后用对象的方法来完成指定的任务。(提示:不同编程语言的正则对象具有的属性和方法,其项目多少或功能强弱有所不同,所以,在VBA中使用正则如果发现没有某种其它语言的方法或属性,请不要感到困惑) 在上一章中,我们给出了一个用VBA删除行尾空格的正则处理例子,它代表了一般的代码框架模式,下面再看一看它的结构特
22、点,并对每一部分的代码段进行剖析:Sub test() Dim regx,S$,Strnew$ 1.定义变量代码段 S=”正则表达式其实很简单 “ 2.目标文本字串变量赋值代码段 Set regx=createobject(“vbscript.regexp”) 3.创建正则对象代码段 Regx.pattern=”s+$” 4.设置正则对象的pattern属性代码段 Regx.global=true 5.设置正则对象的其它属性代码段 Strnew=regx.replace(s,”) 6.应用正则对象方法代码段 Msgbox strnew 7.处理返回值代码段End sub1.定义变量代码段 不必
23、讲解了吧.2.目标文本字符串赋值代码段 目标文本,可能存在于文本文档、Word文档、HTML文档或Excel文档等文档之中。正则对象并不能直接作用于这些文档,只能作用于它们的副本。所以用VBA正则处理这些文档,必须首先从这些文档中读出字符串并赋值于字符变量。如果任务是修改文本,那么,你可能需要编写额外的代码将修改后的文本字符串重新写回原文档中. 例:假如目标文本存在于当前表格A1单元格中.可使用下列代码赋值于字符变量S S=Activesheet.a1 目标文本也可能分别存在于一个数组中,那么,你可能需要通过循环逐一处理. 你也可以直接以输入的方式,赋值给字符变量,就像上面的例子.这时特别注意
24、的是:半角双引号是VBA语言中的保留字符,如果目标文本中本身含有半角双引号,则必须转义,转义方法是:用重复的双引号表示一个双引号. 例:目标文本为:”我们用”汗牛充栋”、”学富五车”形容一个人读的书、拥有的知识多。”. 将之赋值给S的代码为: S=”我们用”汗牛充栋”、”学富五车”形容一个人读的书、拥有的知识多。” 3.创建正则对象代码段 文本处理的各种操作,都是通过操作正则对象来完成的.所以必须创建正则对象.VBA创建或声明正则对象有两方式:早期绑定和后期绑定,你可以根据自己喜好选择其一: 早期绑定: (需要在VBE-工具-引用中勾选Microsoft VBScript Regular Ex
25、pressions 5.5) Dim regx AS RegExp Set regx=new regexp (或dim regx as new regexp) 后期绑定: Set regex = CreateObject(VBScript.RegExp) 利用上述两种方式创建或声明正则对象,实际上是调用Microsoft VBScript脚本的regexp正则对象。Microssoft VBScript脚本,包含在Internet Eeplorer 5.5以及之后的版本中.该脚本中的正则表达式执行的是ECMA-262第3版所规定的标准,与JavaScript脚本中的正则执行标准是相同的。1.0
26、版只是为了向后兼容的目的,功能很弱。 (提示:在VBA中也可调用JavaScript(Jscript)或ruby等脚本中的正则对象,Jscript的元字符及特性与VBscript是一样的,但它的方法或属性要多一点,或者说对正则的支持更强一些.ruby本人不懂,不太了解它的元字符集,只是看到论坛上有人使用) 4.设置对象的pattern属性 语法:object.pattern=”正则表达式” Object是一个正则对象. 把自己编制的正则表达式,以字符串的形式赋值给pattern属性。注意要用英文双引号将正则表达式包围起来. 并且要在对象名与属性名之间用英文点号隔开.属性名pattern是保留字
27、,固定不变的,对象名是用户自定义的。 接下来的两个步骤是对正则对象的操作,通过设置或使用正则对象的属性和方法,以实现对文本的处理.正则对象的属性和方法不多,列表于下:5.设置对象的其它属性 除Pattern属性外,正则对象还有其它三个属性,其属性值有False和True,默认值都是False。如果要使用默认属性,可以不用显示设置;如果要改变默认属性,则需要显示设置: Global 当属性值为False时,只要在目标文本中,找到一个匹配时,即停止搜索。如果想要找出目标文本中的所有匹配,那么需要把它的属性值设置为True。 IgnoreCase 设置对英文字母大小写是否敏感。默认值False, 对
28、大小写敏感;设置为True,忽略大小写. MultiLine 它影响且只影响元字符和$的意义。值为False,无论目标文本是多少行,整个文本中则只有一个开始位置,表示第一行的开始;只有一个行结束位置,$表示文本末尾位置。值为True,那么,和$分别表示每一行的行首和行尾位置。 下面来完成一个简单的任务,再具体认识各属性的使用方法: 有一两行的文本: Aaa Bbb 任务要求: 1.在文本开始和结束处,分别插入一个”符号; 2.在文本每行的开始和行尾分别插入”符号。 正则表达式: |$ 表示匹配行开始或结束位置 任务1代码:Sub test1() Dim reg, s$ s = Aaa & vb
29、Lf & bbb 这里用vblf 表示行之间的换行符 Set reg = CreateObject(vbscript.regexp) reg.Pattern = |$ reg.Global = True s = reg.Replace(s, ) MsgBox sEnd Sub讨论: Msgbox 最后显示的结果为:AaaBbb 代码中修改了global的默认属性值,设置为true;目的是保证能找到并替换全部的开始或结束位置。如果保持默认属性,则只会在开始处插入一个号。 正则对象Reg的其它两个属性保持为默认。因为本任务无关乎字母大小问题,所以IgnoreCase属性无需要设置为Ture(当然如
30、果设置为true,对最后结果也无影响);由于Mutiline属性保持默认,其值为False,所以整个文本只有一个开始位置和一个结束位置。 代码中使用了对象reg的replace方法,它的作用是,将在目标文本中找到的匹配(开始和结束位置)替换为”字符,在这里实际上是插入。然后把修改后的文本返回,重新赋值给字符变量S。 任务2代码:Sub test2() Dim reg, s$ s = Aaa & vbLf & bbb Set reg = CreateObject(vbscript.regexp) reg.Pattern = |$ reg.Global = True reg.MultiLine =
31、 True s = reg.Replace(s, ) MsgBox sEnd Sub 讨论: 任务2代码与任务1代码唯一区别是修改了mutiline默认属性,设置为True。这就意为着,该文本的每一行都存在一个开始位置和结束位置。所以Msgbox最后显示的结果为:AaaBaa 6.应用对象的方法代码段 VBScirpt正则对象的方法共有三个:你可以根据任务要求选择使用一个或多个方法. (1)TEST方法 语法:Object.Test(string) Test方法只是简单测试目标文本中,是否包含正则表达式所描述的字符串。如果存在,则返回True,否则返回False。 例:用代码检测用户的输入是否
32、是一个电子邮箱。Sub ChkEmail() Dim reg, s$ s = InputBox(请输入一个电子邮箱:) Set reg = CreateObject(vbscript.regexp) reg.Pattern = S+S+$ If reg.Test(s) Then MsgBox 你输入的电子邮箱格式正确: & s Else MsgBox 你输入的电子邮箱格式不正确! End IfEnd Sub 讨论: 代码从用户那里获得字符串,然后赋值与字符变量S。验证邮箱的正则表达式非常简略,元字符序列S表示不是空格的任意一个字符,后面紧跟一个+号表示一个以上字符。这个表达式事实上只验证了用户
33、的输入里,在字符串之间是否有一个符号。它甚至认为”0中”都是正确的。下面给出一个更为严格的电子邮箱正则表达式:“w.-+w.-+$”当然要严格按电子邮箱规范写出正则表达式,可能就十分复杂,由于我们刚刚接触正则,就不在详细讨论了。 这里要关注的是,test方法的语法,在方法与正则对象之间也是用英文点号隔开,作为参数,目标字符串用英文括号包围。在这个例子中,如果Test返回的是true,表示目标文本S中找到了正则模式的匹配。则显示正确结果,否则显示错误提示。 (2)Replace方法 替换在目标文本中用正则表达式查找到的字符串。 前面例子中语句体现其语法:s=reg.replace(s,”) 后面
34、括号中的参数S,代表前面代码中设置的目标文本字符串.也就是正则表达式将要作用的目标文本.”是用来替换的字符串参数.前面的s是Replace方法返回的结果,它是目标文本被替换后的一个副本. 如果没有找到匹配的文本,将返回与目标文本一样的一个副本. 下面继续讨论Replace方法的第二个参数: 例子中是一个字面字符,要用一对双引号包围起来。第二个参数还可以是变量、表达式。如果是变量或函数则不能用双引号包围,这一点和VBA代码规则是一致的. 上一章我们知道了如果在正则表达式中使用了元字符序列()括号,那么被圆括号包围的内容会存储在特殊变量$1中。在有些编程语言中,可以直接在正则代码外使用$1变量,而
35、VBScript中可以并只可以在Replace方法中,作为第二参数来调用。 例子:在目标文本中的数字数据后增加上单位:KG 目标文本:“他们体重分别是:张三56,李四49,王五60。” 结果文本要求: “他们体重分别是:张三56KG,李四49KG,王五60KG。” 正则表达式:(d+) 替换文本: $1KGSub testrep() Dim reg, s$ s = 他们体重分别是:张三56,李四49,王五60。 Set reg = CreateObject(vbscript.regexp) reg.Pattern = (d+) reg.Global = True s = reg.Replace
36、(s, $1KG) MsgBox sEnd Sub 讨论: 用正则表达式(d+),Replace方法将在目标文本中找到三个匹配,其值分别是56,49,60。并分别把每个值保存于每一个匹配对象的$1变量中。 替换文本:”$1KG”表示每一个匹配中的$1变量值与字面字符”KG”联结,组成新字符串,用来替换找到的数据字符串。 $1是一个很特殊的变量,它由美元符号与数字编号组成.如果正则表达式中有两个或两个以上的捕获性括号,则按照左括号”(“从左到右顺序编号,自动命名为$1,$2,$3.,共支持99组.要指出的是,如果找到多个匹配,那么每个匹配中的特殊变量名是一样的.这个例中共有三个匹配其值分别为56
37、,49,60.第一个匹配的变量名是$1,第二和第三个匹配的变量名仍然是$1,只是每个匹配中$1保存的值是不一样的. 最后一点,作为替换参数的一部分,$1变量与字面字符共同组成替换字符串时,它们之间不用 & 符号连接,并且 $1 必须放在一个双引号中;而如果是用其它普通变量与字面字符联结组成替换文本时,则必须用 & 符号联接,这一点与VBA代码使用方法相同. 在Replace方法的第二个参数中,还有几个很少用到的特殊变量: 一个较特殊的状况,如果上面所述的特殊变量符不是作为变量使用,而是要以它们作为字面字符的替换文本,那么就要对它们转义,方法是在它们之前加一个美元符号$.如$&(3)Execut
38、e方法 在目标文本中执行正则表达式搜索。 语法:set mh=object.execute(s) 其中mh是用户自定的对象变量,S是值为目标文本的字符串变量.object是正则对象. Execute方法会作用于目标文本(S),并返回一个叫作Matches的集合对象,在这里是mh.在这个集合对象中包含它找到的所有叫做Match的成功匹配对象(Matches集合最多可容纳65536个匹配对象). 如果未找到匹配,Execute 将返回空的 Matches 集合。Matches集合有两个只读属性:索引(Item)和成功匹配的次数(Count). Matches集合中包含的匹配对象Match有四个只读
39、属性:Value/firstindex/length/submatches 值得一提的是,Submatches属性是一个集合属性,集合中元素个数与正则表达式中使用的捕获性括号的个数相同,每个元素的值就是括号包围起来的内容.它也有两个只读属性:item和Count 下面用树状图来表示它们之间的关系,并在接下来的内容中继续逐一讨论它们的用法. Matches集合的Item和Count属性 利用Matches集合的Item属性可以得到它包含的每个Match对象;利用Count属性可以得到成功匹配的个数. Matches集合对象中元素(成功匹配)的索引编号从0开始.我们可以用遍历集合的方式或索引方法读
40、取每一个匹配值. 例:从一段文本中提取所有英文单词. 目标文本:”苹果:iphone_5s;诺基亚:Nokia_1020” 结果要求:分别提取出iphone_5s和Nokia_1020代码:Sub test2() Dim reg, k, mh, strA$ strA = 苹果:iphone_5s;诺基亚:Nokia_1020 Set reg =CreateObject(vbscript.regexp) reg.Pattern = w+ reg.Global = True Set mh = reg.Execute(strA) For Each mhk In mh Debug.Print mhk.
41、value NextEnd Sub讨论: 通过语句Set mh = reg.Execute(strA),Execute方法返回一个集合对象mh,在这个集合对象里包含两个匹配对象,代码中用遍历方法取出每一个匹配对象的值. Execute方法返回的集合对象mh,有两个属性: 1)Count: Execute方法成功匹配的次数,也可理解为mh集合对象中包含的成功匹配对象的个数.语法: N=mh.count 本例中n值为2 2)Item:索引,可以通过索引值,返回集合对象中指定的匹配对象.语法: Set mhk=mh.item(0) K=mhk.value 用索引返回第一个Match对象即mhk.本例
42、中k为第一个Match对象的值(iphone_5s). 同样的方法可以得到第二匹配的值. 由于Item和Value属性是集合的默认属性,所以上面两个语句也可简写为: K=mh(0).第一个匹配对象的值(iphone_5s) M=mh(1).第二个匹配对象的值(Nokia_1020) 上面代码中遍历集合也可以用索引法遍历: For i=0 to mh.count-1 Debug.print mh(i).value Next iMatch对象的属性 Execute方法返回的集合对象中包含的也是对象元素,即match对象,match对象有四个属性: FirstIndex:匹配对象所匹配字符串的起始位
43、置。 Length:匹配对象所匹配字符串的字符长度。 SubMatches:匹配对象所匹配结果中的子项集合。 Value:匹配对象所匹配的值。 在本例中:索引为0,即第一个匹配对象的属性值为: K=mh(0).value k的值为iphone_5s,value是默认属性可简写为k=mh(0) sn=Mh(0).firsindex sn的值为3,表示在目标字符串中,位置3上找到该匹配iphone_5s.(位置是从0开始的) Ln=mh(0).length ln值为9,即iphone_5s的字符长度Match对象的Submatches属性 匹配对象match的Submatches是一个集合属性,它
44、包含正则表达式中用圆括号捕捉到的所有子匹配.它为用户提供了返回$1特殊变量值的方法. 集合Submatches有两个固有属性:Count和Item.可以通过Item得到集合中的每个值,它实际就是在正则表达式中用圆括号捕获的内容;Count值是集合中元素个数,实际上就是正则表达式中捕获性圆括号的个数.下面给一个实例来说明: 目标文本:给定一个标准邮箱地址:J3721163.com 要求:从邮箱中分别提取出:用户名j3721,服务器域名163.com 正则表达式: (w+)(.+)$ 代码:Sub test5() Dim reg, mh, strA$, username$, domname$ st
45、rA = J3721163.com Set reg = CreateObject(vbscript.regexp) reg.Pattern = (w+)(.+)$ Set mh = reg.Execute(strA) N=mh(0).submatches.count n值等于2 username = mh(0).submatches(0) j3721 domname = mh(0).submatches(1) 163.comEnd Sub讨论: 正则表达式中,w+表示匹配前面的所有英文单词字符;后面的点号是一个元字符,表示匹配除换行符外的所有字符之一,后面紧跟+号,即”.+”表示匹配后面除了换
46、行符外的所有字符.用括号包围起来,用户名和域名就会自动分别保存在变量$1和$2中. 前面已经知道VBA不能在replace之外直接调用$1或$2,而这个例子告诉我们可以用match对象的submatches集合属性来提取. 在这个例子中,execute方法返回的集合对象mh中,mh中只有一个匹配对象Match,即mh(0);mh(0)对象的属性submatches(0),返回第一个括号中的内容,即j3721.而submatches(1),返回第二个括号中的内容.submathches集合也有count属性,所以如果有很多子项需要提取,也可用遍历或索引方法返回每一个特殊变量值.最后再给一例子:
47、下面的代码演示了如何从一个正则表达式获得一个SubMatches集合以及它的专有成员: 正则表达式(一个邮箱地址): (w+)(w+).(w+) 如果你没有进一步了解元字符,可能不懂其中含义,不过没关系,在这里你只要知道,该代码的任务是显示电子邮箱,用户名和组织名.Function SubMatchTest(inpStr) Dim oRe, oMatch, oMatches Set oRe = New RegExp 查找一个电子邮件地址 oRe.Pattern = (w+)(w+).(w+) 得到Matches集合 Set oMatches = oRe.Execu
48、te(inpStr) 得到Matches集合中的第一项 Set oMatch = oMatches(0) 创建结果字符串。 Match对象是完整匹配 retStr = 电子邮件地址是: & oMatch & vbNewline 得到地址的子匹配部分。 retStr = retStr & 电子邮件别名是: & oMatch.SubMatches(0) dragon retStr = retStr & vbNewline retStr = retStr & 组织是: & oMatch. SubMatches(1) xyzzy SubMatchTest = retStr
49、End FunctionSub SubMatchesTest() MsgBox(SubMatchTest(请写信到。谢谢!)End Sub(前面第一篇的第一/二部分,概要阐述了正则表达式的基本思想,并对正则在VBA中的实现(也就是Regexp对象操作)作了详细讲解.接下来的第二至第六部分我们将集中介绍VBA中(本质上是Regexp对象中)可使用的全部元字符(序列),有的称为元字符的特性,有的叫作正则语法.反正它的基本属性就是用来描述字符的特殊字符.) 三.正则元字符-字符表示法 人类自然语言所用字符极其丰富多样,我们已经知道正则表达式是用元字符及它们的组合来描述这
50、些字符以及这些字符组成的特定结构的.需要指出的是,正则没有统一标准,它是分流派的.在不同语言平台上(或同语言平台而版本不同),正则元字符的多少往往不同,同一元字符的特性也可能存在一定的差异.正是这个原因,在你参考各种正则资料的时候,尤其要注意这个问题.前面已经阐明,目前VBA平台上,用的是VBScript提供的正则对象,执行的是ECMA-262所规定的标准. VBscript提供的元字符可方便地描述ASCII码表中的字符集.ASCII码表基本上包括了英文语系所用的所有字符.(如果你不熟悉,可以上网查查,大体上了解有哪些字符).也支持代码点不超过四位十六进制数的Unicode表的字符集.这解决了
51、包括汉字在内的世界各国的官方文字的表示问题.为方便用户在不同环境下使用,同一字符往往有多种等价表示方法. 下面是对表示字符的元字符及序列的分类介绍: (一)对于一些常用的不可打印字符,规定了专用的元字符序列 用正则表达式来描述一段字符串,即使它是看不见的,也必须毫无遗漏地表示出来.比如,空格,空白字符和一些不可打印字符,所以,在元字符(序列)中都有它们的表示方法. (二)普通字符组:肯定字符组a-z及否定字符组a-z 肯定字符组表示方括号内列出的任意一个字符.否定字符组是在左方括号后紧跟着一个脱字符”,表示匹配括号内未列出的任一字符.例:讨论: 1.如果字符范围在ASCII码表或Unicode
52、字符表中是连续分布的,可以只用起止字符表示范围,中间用”-“连接. 2.用”-“连接的字符范围,前面必须是起点字符,如不能把a-z写为z-a 3.字符组内的字符顺序无关紧要,如ieou与eiuo是一个意思. 4.如果”-“字符中最左或最右位置,它表示匹配字面字符”-“.如ieou- 5.如果”没有紧跟在”“之后,它也只表示字面字符”. (三)字符组缩略表示法对于一些常用的字符类,正则提供了简略表示法: 提示:肯定类字符缩略表示法,只能表示ASCII码表中的字符,而该表中的否定元字符序列,它们可以匹配文本中unicode字符. 实例: 正则表达式 WWswww 它表示匹配一个非单词字符,紧跟又是
53、一个非单词字符,再是一个空格,最后连续三个单词字符.可以匹配:”正则ABC”,”规则1_3”等. (四)几乎能匹配任何字符的元字符:英文句点 英文点号”.”可以匹配除换行符(n)外的任意字符之一.它不限于ASCII码表中的字符,只要能显示于电脑上的字符都能匹配.在VBA中,英文句点等价于n. (五)控制字符表示法:cChar 在ASCII码表中,十进制代码为1-26的字符全是控制字符,可以用”c”连接字母A-Z之一来表示.即cA-cZ分别表示代码为1-26的控制字符.如”cM”,表示回车符. (六)ASCII码表中字符的八进制转义表示法:num VBscript正则可用字符的八进制编码转义来表
54、示ASCII字符:它的序列由反斜线和字符的八进制编码组成.例: 提示:八进制转义法表示字符范围:0-377,包括ASCII码表和扩展表中的256个字符.该表示法主要用于难以输入的字符. (七)ASCII码表中字符的十六进制转义表示法: xnum 一个小写的X后跟两个大写十六进制数字可以匹配ASCII字符集中的一个字符. 提示:可匹配范围x00-xFF,但一般用x00-x7F表示ASCII字符集中的前128个字符.x80-xFF(ASCII扩展码表字符),一般用Unicode代码点表示法替代. (八)Unicode码表中字符的十六进制转义表示法:unum Unicode码一般用称之为代码点来表示
55、一个字符.它是一个十六进制数. 正则表达式中,用“u”序列后面紧跟字符unicode代码点(十六进制数)表示该字符.例:提示:1.unum表示法可表示代码点在U+0000-U+FFFF范围内的unicode字符.Unicode本身在发展中,已经出现超过4位的代码点,VBscript正则是不支持,但它们是很难遇到的字符.2.用字符组表示Unicode字符范围时,也可直接用表中起点字面字符与终点字面字符表示.比如大陆中文字符在Unicode表中,起始代码点是U+4e00,是表示中文字符”一”,终点代码点U+9fff,该代码点未定义,而”龥”字在终点附近,所以我们也可以用”一-龥”表示所有中文字之一.顺便提示一点,汉字在Unicode
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中南大学非事业编制工作人员招聘13人笔试模拟试题及答案解析
- 2026广西南宁市青秀区凤岭北路中学教师招聘笔试备考试题及答案解析
- 2026年四川省攀枝花市高职单招职业适应性测试考试题库有答案详细解析
- 2026重庆荣昌区招聘社区工作者后备人选454人笔试备考题库及答案解析
- 2026粤海控股集团所属粤西供水、科达水电公司招聘4人笔试模拟试题及答案解析
- 2026中兴通讯实习生招聘考试备考题库及答案解析
- 2025-2026学年西藏西藏达孜县达标名校初三下学期寒假验收考试英语试题含解析
- 2026届广东省番禺区六校教育教联合体初三下学期第三次质量考评英语试题含解析
- 安阳市安阳一中学2026年初三下学期第五次模拟语文试题含解析
- 河南省郑州一中市级名校2025-2026学年初三三模(最后一卷)英语试题试卷含解析
- 2026年超声波检测二级试题库(UT)(含答案)(一)
- 2026广东中山市神湾镇招聘雇员17人考试参考题库及答案解析
- 2025年初级电焊工理论考试题及及答案
- 单位内部报账管理制度
- 2026黑龙江牡丹江市绥芬河海融城投房地产开发有限公司招聘建经合约职员2人考试参考题库及答案解析
- 2026年安徽国际商务职业学院单招职业适应性测试题库带答案详解ab卷
- 探本溯源:高三化学复习备考中回归教材的深度剖析与实践策略
- 2026年装饰建材购销合同(1篇)
- 2025年淮南职业技术学院单招职业技能考试模拟测试卷附答案解析
- 高速公路收费业务培训
- 2026年春期人教版二年级下册数学全册教案(核心素养教案)
评论
0/150
提交评论