VBA正则表达式⼊门与提⾼
有⼀位美国佬编写的<<;精通正则表达式>>专业书籍是世⼈公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语⾔背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在VBA中⽤不上或者对你来说根本⽆⽤的,⽽初学者的你却根本不知道怎样取舍.事实上,本⼈还没有发现⼀本针对VBA平台的正则专业书籍.⽹络可见到少量VBA正则教程,但内容多是”点到为⽌”.
鉴于此,有此贴⽂.在这⾥感谢本论坛liucqa⽼师的⿎励,在之前本⼈写过⼀篇正则对象操作的短⽂,liucqa⽼师留贴建议多写⼀点,但⼀致未能成⽂.此帖算是对liucqa⽼师的交代.
内容提要
⽬录
第⼀篇 基础篇
⼀、 正则表达式概论—理解正则表达式
⼆、 正则表达式与VBA的交互—正则表达式的实现
三、 正则元字符—字符的表⽰法
四、 正则元字符—数量的表⽰法
五、 正则元字符—位置的表⽰法
六、 正则元字符—分组及控制表⽰法
第⼆篇 进阶篇
⼀、 元字符与字符集
⼆、 ^$的位置到底是哪⾥
三、 字符组内部元字符转义规则
四、 字符组与多选结构“|”
五、 否定环视与否定字符组
六、 顺序环视的多⾓度理解与应⽤
第三篇 原理篇
⼀、匹配的基本术语
⼆、匹配总原则
三、正则表达式匹配的基本过程
四、回溯
五、回溯的总结
六、回溯与效率
七、灾难回溯
第四篇 技巧篇
⼀、匹配具有多种形态结构的字符串
⼆、匹配特定位置上的字符串
三、匹配其内部由相似结构字符串构成的字符串
四、在⼀⼤段⽂本中,匹配⼀对特定字符串之间的字符串
五、匹配⼀对特殊字符界定的之间的字符串,但其内部包含两端的界定字符
第⼀篇 基础篇
⼀、正则表达式概论----理解正则表达式
⽂本处理是⼀项常见的⼯作任务,⽐如:在⼀段⽂本或数据中,查、替换、提取、验证、分离和删除等特定字符或字符串。在⼏乎所有⽂本编辑器中(如word/excel/VBE等)都提供了字符串的查/替换功能;在编程语⾔的世界⾥更是提供了丰富的字符处理函数和⽅法。VBA中有Find(查某字符串)、Replace(⽤⼀字符串去替换⽂本中的另⼀字符串)、LIke(判断某字符串是否存在)等等。
编程语⾔本⾝提供的字符处理函数或⽅法,具有⽤法简单、处理快速和使⽤便捷的特点。不过这些函数或⽅法也存在很⼤缺陷:它们通常都是对⾮常具体的字⾯⽂字进⾏操作,假如要处理某⼀类具有某些相似特征的字符或字符串,就显得⼒不从⼼了。举个例⼦,要求在⼀⼤段⽂本中,查所有的符合规范的电⼦邮箱。如果⽤VBA本⾝提供的字符处理函数来处理,显然不是⼀件容易的事。可见,在现实的世界⾥对复杂动态⽂本的处理,仅靠编程语⾔本⾝是不够的。为此,⼈们到了⼀种功能更为强⼤的⽂本处理解决⽅案----正则表达式⽅案。
正则表达式是强⼤、便捷、⾼效的⽂本处理⼯具。利⽤它使⽤者可以描述和分析任何复杂的⽂本,配合编程语⾔或⽂本编辑器提供的⽀持,正则表达式能够查、替换、提取、验证、添加、删除、分离和修整各种类型的⽂本和数据。当今主流编程语⾔(如:
java/C#/C++//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}?
例:
(22.65 KB, 下载次数: 921)
(22.47 KB, 下载次数: 834)
(三)⽤正则处理⽂本的⼀个例⼦
我们已经认识了⼏个简单的元字符(序列),并能⽤它们构建⼀些实⽤的正则表达式,那么,怎样把它们应⽤于VBA中呢?,下⾯我们⽤正则在VBA中来完成⼀个简单的任务:
⽬标⽂本:”正则表达式其实很简单 “
任务:删除⽬标⽂本中⾏尾空格.
分析:
1.\s可表⽰空格,+表⽰出现⼀个或多个字符,所以可⽤”\s+”表⽰连续多个空格.$表⽰⼀⾏的⾏尾,于是可⽤以下正则表达式描述⾏尾的若⼲空格:
\s+$
2.我们把上⾯的正则代码表达式作⽤于⽬标⽂本,查与模式吻合的字符(串),并⽤空字符替换,从⽽达成实现删除空格任务。
下⾯是完整的VBA代码:
Sub Test()
Dim regx, S$, Strnew$
S = "正则表达式其实很简单 "
Set regx = CreateObject("p")
regx.Pattern = "\s+$"
regx.Global = True
Strnew = regx.Replace(S, "")
MsgBox Strnew
End Sub
这个简单的例⼦说明了正则实现的⼀般步骤:
1、 创建变量:这个例⼦中,变量regx是⼀个对象,S是字符串变量;Strnew也是字符串变量.
2、 把⽬标⽂本赋值给变量S
3、 创建⼀个正则对象regx
4、 设置正则对象regx的pattern属性,即把正则表达式以字符串形式赋值给pattern.
5、 设置正则regx对象的其它属性,例⼦中设置Global属性为真
6、 应⽤对象提供的⽅法,实现相应功能.例⼦中,利⽤regx对象的Replace⽅法实现替换.
7、 输出处理后的字符串.
到这⾥,你已经完全了解了⽤正则处理⽂本的基本过程和思路,以及在VBA中使⽤正则的代码框架.以后的任务是全⾯掌握正则的所有元字符和它们的⼯作原理,另外还需要进⼀步了解正则对象的各种属性和⽅法.
要提醒的是,”基础篇”的应⽤实例或许并不是解决该任务的最佳⽅案,也或许是⼀些看似很⽆聊的例⼦,但请不要忽视它们.正是透过这些简单的实例,揭⽰了概念的本质.
补充内容 (2014-6-20 19:04):
最近看了liucqa⽼师⼀个贴⼦,在处理"⼤字符串"时,即使可⽤VBA函数或⽅法处理,但不如⽤正则处理速度快.⽐如:⽤Split将⽤逗号连接的10万个数字字符串转化的为数组,如果⽤正则处理,只需要⼀半的时间.
补充内容 (2016-6-8 07:30):
本页例中的regx.Global=True语句,此时不是必须的,只是为了说明属性的应⽤.
⼆.正则与VBA的交互—正则表达式的实现
在继续学习正则元字符特性或编制⾃⼰的正则表达式时,常常需要对其测试.你可以⽤⼀些专门的正则测试⼯具(推荐RegxBuddy);也可以⾃⼰编制VBA代码进⾏测试。不过建议初学者,经常编写VBA代码进⾏测试,这样可以提⾼今后实际应⽤正则的能⼒。所以,在进⼀步学习正则元字符特性之前,我们先介绍正则与VBA的交互的相关知识。你可以快速阅读或越过本章内容,在以后具体应⽤时,再经常回头查阅。当然也可以⽤上⼀章学到的知识详细研究本章内容,在以后的学习中专注于正则表达式本⾝.
⽤正则处理⽂本,是通过正则表达式与程序设计语⾔的交互来实现的。其交互⽅式在不同编程语⾔中分为三⼤类:
⼀是集成式。Perl语⾔本⾝内建正则操作符,可以直接作⽤于正则表达式.操作符作⽤于正则表达式就像数学的+-号作⽤于数字⼀样.不需要构建正则对象。例如:任务是要把变量$text保存的⽂本中的空⾏替换为标签(<P>)。
正则表达式
^$ 表⽰空⾏.
在Perl语⾔中,可以⽤⼀句代码实现替换:$text=~ s/^$/<p>/g
⼆是函数式处理。Java等语⾔,为正则处理提供了⼀些便捷函数,以节省⼯作量.⽤户不需要⾸先创建⼀个正则对象,⽽是⽤静态函数提的临时对象来完成正则处理,处理完后把临时对象抛弃. 正则表达式对于函数相当于⼀个参数, 这种⽅式的优点是”随⼿”可⽤,但不适宜在对时间要求很⾼的循环中使⽤.所以java也提供了下⾯讲到的⾯向对象的程序式处理.
三是⾯向对象的程序式处理。这是⼤多数编程语⾔的正则处理⽅式。VBA平台采⽤的也是这种⽅式。⾯向对象的程序式处理⽅式,⾸先必须创建⼀个正则对象的实例,然后设置对象必要的属性,最后⽤对象的⽅法来完成指定的任务。(提⽰:不同编程语⾔的正则对象具有的属性和⽅法,其项⽬多少或功能强弱有所不同,所以,在VBA中使⽤正则如果发现没有某种其它语⾔的⽅法或属性,请不要感到困惑)
在上⼀章中,我们给出了⼀个⽤VBA删除⾏尾空格的正则处理例⼦,它代表了⼀般的代码框架模式,下⾯再看⼀看它的结构特点,并对每⼀部分的代码段进⾏剖析:
Sub test()
Dim regx,S$,Strnew$ 1.定义变量代码段
S=”正则表达式其实很简单 “ 2.⽬标⽂本字串变量赋值代码段
Set regx=createobject(“p”) 3.创建正则对象代码段
Regx.pattern=”\s+$” 4.设置正则对象的pattern属性代码段
Regx.global=true 5.设置正则对象的其它属性代码段
place(s,””) 6.应⽤正则对象⽅法代码段
Msgbox strnew 7.处理返回值代码段
End sub
1.定义变量代码段
不必讲解了吧.
2.⽬标⽂本字符串赋值代码段
⽬标⽂本,可能存在于⽂本⽂档、Word⽂档、HTML⽂档或Excel⽂档等⽂档之中。正则对象并不能直接作⽤于这些⽂档,只能作⽤于它们的副本。所以⽤VBA正则处理这些⽂档,必须⾸先从这些⽂档中读出字符串并赋值于字符变量。如果任务是修改⽂本,那么,你可能需要编写额外的代码将修改后的⽂本
字符串重新写回原⽂档中.
匹配邮箱的正则表达式例:假如⽬标⽂本存在于当前表格A1单元格中.可使⽤下列代码赋值于字符变量S
S=Activesheet.[a1]
⽬标⽂本也可能分别存在于⼀个数组中,那么,你可能需要通过循环逐⼀处理.
你也可以直接以输⼊的⽅式,赋值给字符变量,就像上⾯的例⼦.这时特别注意的是:半⾓双引号是VBA语⾔中的保留字符,如果⽬标⽂本中本⾝含有半⾓双引号,则必须转义,转义⽅法是:⽤重复的双引号表⽰⼀个双引号.
例:⽬标⽂本为:”我们⽤”汗⽜充栋”、”学富五车”形容⼀个⼈读的书、拥有的知识多。”.
将之赋值给S的代码为:
S=”我们⽤””汗⽜充栋””、””学富五车””形容⼀个⼈读的书、拥有的知识多。”
3.创建正则对象代码段
⽂本处理的各种操作,都是通过操作正则对象来完成的.所以必须创建正则对象.VBA创建或声明正则对
象有两⽅式:早期绑定和后期绑定,你可以根据⾃⼰喜好选择其⼀:
早期绑定: (需要在VBE--⼯具--引⽤中勾选Microsoft VBScript Regular Expressions 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版只是为了向后兼容的⽬的,功能很弱。
(提⽰:在VBA中也可调⽤JavaScript(Jscript)或ruby等脚本中的正则对象,Jscript的元字符及特性与VBscript是⼀样的,但它的⽅法或属性要多⼀点,或者说对正则的⽀持更强⼀些.ruby本⼈不懂,不太了解它的元字符集,只是看到论坛上有⼈使⽤)
4.设置对象的pattern属性
语法:object.pattern=”正则表达式”
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论