正则表达式入门与提高Word文档格式.docx
- 文档编号:21096349
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:60
- 大小:483.84KB
正则表达式入门与提高Word文档格式.docx
《正则表达式入门与提高Word文档格式.docx》由会员分享,可在线阅读,更多相关《正则表达式入门与提高Word文档格式.docx(60页珍藏版)》请在冰豆网上搜索。
(三)肯定顺序环视与否定顺序环视29
第二篇
元字符(序列)进阶篇34
一、元字符与字符集34
二、^$的位置到底在哪里35
三、字符组中元字符转义规则36
四、字符组与多选结构”|”36
五、否定顺序环视与否定字符组37
六、环视的多角度理解与应用38
(一)用作锁定特定位置的文本字符串38
(二)用作对特定字符串是否存在的判断39
第三篇
正则匹配的工作原理41
一、匹配的基本术语41
1.匹配41
2.正则”引擎”41
3.引擎”眼”中的目标文本—位置和字符41
4.子表达式42
二、匹配总原则42
三、正则表达式匹配的基本过程42
1.在正则制导下,引擎从目标文本的开始处,依次进行匹配尝试.42
2.引擎依次在目标文本的每一个位置上,尝试整个正则表达式中的所有子表达和组成元素,直到匹配失败,才移动到下一个位置.43
3.匹配优先量词总是匹配尽可多的字符44
4
.忽略优先量词总是匹配尽可能少的字符45
四、穷尽所有可能途径找到匹配---回溯46
(1)多选结构的回溯46
(2)量词”?
”的回溯47
(3)量词”*”的回溯48
五.回溯的总结48
六.回溯与效率49
七.灾难回溯50
第四篇技巧篇52
一.匹配具有多种形态结构的字符串52
1.匹配下列文本中的<
HR>
标签,它可能呈现的形式例举如下:
52
2.匹配浮点数,它可能有下列几种呈现形式:
53
3.匹配某范围内的数据53
讨论:
54
二、匹配特定位置上的字符串54
三、匹配其内部由相似结构字符串构成的字符串56
四、匹配一段文本,这段文本中不能包含特定字符串58
五、匹配一对特殊字符界定的之间的字符串,但其内部包含两端的界定字符59
例1
目标文本59
例2
目标文本60
62
结束语63
有一位美国佬编写的<
<
精通正则表达式>
>
专业书籍是世人公认的正则权威著作.但它不太适合初学者,尤其是没有相关编程语言背景及书中所及的种种计算机技术知识的读者.其中很多晦涩难懂的内容在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保存的文本中的空行替换为标签(<
P>
)。
正则表达式
^$表示空行.
在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("
reg.Pattern="
^|$"
reg.Global=True
s=reg.Replace(s,"
@"
MsgBoxs
Msgbox最后显示的结果为:
@Aaa
Bbb@
代码中修改了global的默认属性值,设置为true;
目的是保证能找到并替换全部的开始或结束位置。
如果保持默认属性,则只会在开始处插入一个@号。
正则对象Reg的其它两个属性保持为默认。
因为本任务无关乎字母大小问题,所以IgnoreCase属性无需要设置为Ture(当然如果设置为true,对最后结果也无影响);
由于Mutiline属性保持默认,其值为False,所以整个文本只有一个开始位置和一个结束位置。
代码中使用了对象reg的replace方法,它的作用是,将在目标文本中找到的匹配(开始和结束位置)替换为”@”字符,在这里实际上是插入。
然后把修改后的文本返回,重新赋值给字符变量S。
任务2代码:
Subtest2()
reg.MultiLine=True
讨论:
任务2代码与任务1代码唯一区别是修改了mutiline默认属性,设置为True。
这就意为着,该文本的每一行都存在一个开始位置和结束位置。
所以Msgbox最后显示的结果为:
@Aaa@
@Baa@
6.应用对象的方法代码段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 表达式 入门 提高