正则表达式入门学习.doc

上传人:新** 文档编号:563947867 上传时间:2023-11-11 格式:DOC 页数:36 大小:1.47MB
返回 下载 相关 举报
正则表达式入门学习.doc_第1页
第1页 / 共36页
正则表达式入门学习.doc_第2页
第2页 / 共36页
正则表达式入门学习.doc_第3页
第3页 / 共36页
正则表达式入门学习.doc_第4页
第4页 / 共36页
正则表达式入门学习.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《正则表达式入门学习.doc》由会员分享,可在线阅读,更多相关《正则表达式入门学习.doc(36页珍藏版)》请在金锄头文库上搜索。

1、61基础知识拓展正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。正则表达式的使用难度只相当于文本编辑器的搜索命令,但功能却与完整的文本处理语言一样强大。本书将向读者展示正则表达式提高生产率的诸多办法。它会教导读者如何学会用正则表达式来思考(think regular expressions),以便于掌握它们,充分利用它们

2、的强大功能。如果使用当今流行的程序设计语言,解决重复单词问题的完整程序可能仅仅只需要几行代码。使用一个正则表达式的搜索和替换命令,读者就可以查找文档中的重复单词,并把它们标记为高亮。加上另一个,你可以删除所有不包含重复单词的行(只留下需要在结果中出现的行)。最后,利用第三个正则表达式,你可以确保结果中的所有行都以它所在文件的名字开头。在下一章里,我们会看到用Perl和Java编写的程序。宿主语言(例如Perl、Java以及VB.NET)提供了外围的处理支持,但是真正的能力来自正则表达式。为了驾驭这种语言,满足自己的需求,读者必须知道如何构建正则表达式,才能识别符合要求的文本,同时忽略不需要的文

3、本。然后,就可以把表达式和语言支持的构建方式结合起来,真正处理这些文本(加入合适的高亮标记代码,删除文本,修改文本,等等)。解决实际问题Solving Real Problems掌握正则表达式,可能带来超乎你之前想象的文本处理能力。每一天,我都依靠正则表达式解决各种大大小小的问题(通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题)。要说明正则表达式的价值,可以举一个用正则表达式解决大而重要的问题的例子,但是它不一定能代表正则表达式在平时解决的那些“不值一提”(uninteresting)的问题。这里的“不值一提”是指这类问题并不能成为谈资,可是不解决它们,你就没法继续干活。举个简单

4、的例子,我需要检查许多文件(事实上,本书的手稿存放在70个文件中),确保每一行中SetSize出现的次数与ResetSize的一样多。为了应付复杂的情况,我还需要考虑大小写的情况(举例来说,setSIZE也算做SetSize)。人工检查32 000行文字显然不现实。即便使用文本编辑器的“单词查找”功能,也不够方便,尤其是对所有文件进行同样的操作,何况还需要考虑所有可能的大小写情况。正则表达式就是解决这个问题的灵丹妙药。只需要一个简单的命令,我就能够检查所有的文件,获得我需要知道的结果。时间是:写命令大概15秒,检索所有的数据实际只花了2秒。这真是棒极了(如果您想知道这是怎么做到的,不妨现在就翻

5、到第36页)!再举一个例子,我曾帮助一个朋友处理远端机器上的某些E-mail,他希望我把他邮箱文件中的消息作为列表发送给他。我可以把整个文件导入文本编辑器,手工删除所有信息,只留下邮件头中的几行,作为内容的列表。尽管文件不是很大,连接速度也不算慢,这样的任务还是很耗费时间而且很乏味。而且,窥见他的邮件正文,也令我尴尬。正则表达式再一次提供了帮助!我用一个简单的命令(使用本章稍后提到的一个常用工具egrep)显示每封邮件的From:和Subject:字段。为了告诉egrep我需要提取哪些行,我使用了正则表达式(From|Sbuject):。朋友得到这个列表之后,让我找一封特殊的(5 000行!)

6、邮件。使用文本编辑器或者邮件系统来提取一封邮件无疑非常耗时。相反,我借助另一个工具(叫做sed),同样使用正则表达式来描述文件中我需要的内容。这样,我能迅速而方便地提取和发送需要的邮件。使用正则表达式节省下来的时间或许并不能让人“激动”,但总比把时间消耗在文本编辑器中要好。如果我不知道有正则表达式这种玩意儿,根本就不会想到还有别的解决办法。所以,这个故事告诉我们,正则表达式和相关的工具能够让我们以可能未曾想过的方式来解决问题。一旦掌握了正则表达式,你就会知道到它简直是工具中的无价之宝,你也难以想象之前那些没有正则表达式的日子是怎么度过的注1:用过TiVo(译注:TiVo是一种数字录像机,具有许

7、多神奇的功能,例如根据用户的偏好自动录制节目,自动跳过电视台的广告,等等)的人都体验过这种感觉。全面掌握正则表达式是很有用的。本书提供了掌握这种技能所需要的信息,我同时也希望,这本书也提供了促使你学习的动机。作为编程语言的正则表达式Regular Expressions as a Language如果没有正则表达式相关经验,读者可能无法理解上个例子中正则表达式(From|Subject):的意义,但是这个表达式并没有什么神奇之处。其实魔术本身也不神奇,只是缺乏训练的普通观众不明白魔术师掌握的那些技巧而已。如果你也懂得如何在手中藏一张牌,那么,熟练之后,你也可以“变魔术”。外语也是这样 一旦掌握

8、了一门外语,你就不会觉得它像天书了。以文件名做类比The Filename Analogy选择这本书的读者,大概对“正则表达式” 多少有点认识。即便没有,也应该熟悉其中的基本概念。我们都知道,report.txt是一个文件名,但是,如果你用过Unix或者DOS/Windows的话,就会知道“*.txt”能够用来选择多个文件。在此类文件名(称为“文件群组”file globs或者“通配符”wildcards)中,有些字符具有特殊的意义。星号表示“任意文本”,问号表示“任意单个字符”。所以,文件群组“*.txt”以能够匹配字符的*符号开头,以普通文字.txt结尾,所以,它的意思是:选择以任意文本开

9、头,以.txt结尾的所有文件。大多数系统都提供了少量的附加特殊字符(additional special characters),但是,总的来说,这些文件名模式(filename patterns)的表达能力还很有限。不过,因为这类问题的领域很狭窄只涉及文件名,所以这算不上缺陷。不过,处理普通的文本就没有这么简单了。散文、诗、程序代码、报表、HTML、表格、单词表到你想得出的任何文本。如果某种特殊的需求足够专业,例如“选择文件”,我们可以发明一些特殊的办法和工具来解决问题。不过,近年来,一种“通用的模式语言”(generalized pattern language)已经发展起来,它功能强大,

10、描述能力也很强,可以用来解决各种问题。不同的程序以不同的方式来实现和使用这种语言,但是综合来说,这种功能强大的模式语言和模式本身被称为“正则表达式”(regular expression)。以语言做类比The Language Analogy完整的正则表达式由两种字符构成。特殊字符(special characters,例如文件名例子中的*)称为“元字符”(metacharacters),其他为“文字”(literal),或者是普通文本字符(normal text characters)。正则表达式与文件名模式(filename pattern)的区别就在于,正则表达式的元字符提供了更强大的描

11、述能力。文件名模式只为有限的需求提供了有限的元字符,但是正则表达式“语言”为高级应用提供了丰富而且描述力极强的元字符。为了便于理解,我们可以把正则表达式想象为普通的语言,普通字符对应普通语言中的单词,而元字符对应语法。根据语言的规则,按照语法把单词组合起来,就会得到能传达思想的文本。在E-mail的例子中,我用正则表达式(From|Subject):来寻找以From:或者Subject:开头的行。下画线标注的就是特殊字符,稍后我们将解释它们的含义。就像学习任何一门外语一样,第一眼看上去,正则表达式很不好理解。这也是那些对它只有粗浅了解或者根本不了解的人觉得正则表达式很神奇的原因。但是,就像学日

12、语的人很快就能理解正規表現簡単!注2:这句话的意思是,“正则表达式很简单!”。有趣的是,就像第3章介绍的,“正则表达式”这个术语来自形式代数。问我这本书的主题的人,如果对这个概念不熟悉,听到“正则表达式”多半会满脸茫然。正则表达式在日文中写作,正規表現,同它的英文名字一样不好理解,但是我用日语来回答通常会令人反应更奇怪。因为在日文中,“正则”(regular)很不幸地与一个表示“生殖器官”的医学术语发音相同。读者可以想象,在我没有解释之前,人们会有多么惊奇。s!(0-9+(.0-9+)3)!$1!这个例子取自一个Perl脚本,我的编辑器用它来修改手稿。手稿的作者错误地使用了这个tag来标注IP

13、地址(类似209.204.146.22这样由数字和点号构成的字符串)。其中的奥妙就在于使用Perl的文本替换命令,使用:(0-9+(.0-9+)3)把IP地址两端的tag替换为,而不改动其他的标签。在后面的章节中,读者会了解这个表达式的构造细节,然后就能按照自己的需求,在自己的应用程序或者开发语言中应用这些技巧。本书的目的你或许不需要重复把替换为的工作,不过很可能需要解决“把这些文字替换为那些文字”的问题。本书的目的不是提供具体问题的解决办法,而是教会读者利用正则表达式来思考,解决遇到的各种问题。正则表达式的思维框架The Regular-Expression Frame of Mind我们将

14、会看到,完整的正则表达式由小的构建模块单元(building block unit)组成。每个单独的构建模块都很简单,不过因为它们能够以无穷多种方式组合,将它们结合起来实现特殊目标必须依靠经验。所以,本章提供了有关正则表达式的若干概念的总体描述。这一章并没有艰深的内容,而是为本书其余章节的知识打下基础,在深入探索正则表达式之前,把相关事宜阐释清楚。某些例子看起来可能有点无聊(因为它们确实无聊),但它们代表了一类需要完成的任务,只是读者目前可能还没有意识到。即使觉得每个例子的意义都不大也不必担心,慢慢理解其中的道理就好。这就是本章的目的。对于有部分经验的读者If You Have Some Re

15、gular-Expression Experience如果读者已经熟悉正则表达式,这些综述便没有太大价值,但务必不要忽略它们。你或许明白某些元字符的基本意义,但某些思维和看待正则表达式的方式可能是你不了解的。就像真正懂演奏和仅仅会弹奏之间差别迥异一样,了解正则表达式和真正理解正则表达式并不是一回事。某些内容可能会重复读者已经了解的知识,但方式可能与之前的不同,而且这些方式正是真正理解正则表达式的第一步。检索文本文件:EgrepSearching Text Files: Egrep文本检索是正则表达式最简单的应用之一 许多文本编辑器和文字处理软件都提供了正则表达式检索的功能。最简单的就是egrep。在指定了正则表达式和需要检索的文件之后,egrep会尝试用正则表达式来匹配每个文件的每一行,并显示能够匹配的行。许多系统例如DOS、MacOS、Windows、Unix等等都对应有免费提供的egrep。在本书的网页http:/regex.info上可以找到获得对应读者操作系统的egrep拷贝的链接。回到第3页的E-mail的例子,真正用来从E-mail文件中提取结果的命令如图1-1所示。egrep把第一个命令行参数视为一个正则表达式,剩下的参数作为待搜检索的文件名。注意,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号