正则指引(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-29 02:50:20

点击下载

作者:余晟

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

正则指引

正则指引试读:

前言

提到正则表达式,许多人很有点不屑一顾:这东西,不登大雅之堂,再说也不是总要用到,何必专门花时间学习?

没错,正则表达式并不“总要用到”,但到了需要的场合用不上,往往产生“一分钱难倒英雄汉”的尴尬。经常需要处理文本的程序员自然会知道正则表达式的价值,其他的程序员如果不会正则表达式,即便开发的领域与文本处理没什么关系,也难免“躺着中枪”的命运——前几天我遇到一个问题,将一行长长的地址拆分成多行,负责这部分的程序员的日常工作只是制作PDF而已,拆分地址是很“边缘”的功能,但不会正则表达式就无法准确折行(一般需要在标点符号出现的地方折行,而不能只在空白字符处折行,但是不同语言中的标点符号各有不同),结果一筹莫展;相反,如果了解正则表达式,就可以很容易地处理各种语言中的标点字符。

以我的开发经验来看,专门花点时间掌握正则表达式,确实是非常有必要的。目前可以见到的关于正则表达式的书籍和资料有不少,但又各有不足。

在互联网上,流传着一些编程语言的正则文档和《30分钟教会你正则表达式》之类的帖子。这类资料的好处是简单直接,查到了,如果有现成的例子,而且适用于自己的语言,则可以直接拿来用;然而,其坏处也是简单直接,因为缺乏背后原理的讲解,如果找不到现成的例子,或者找不到能在自己所使用语言中行得通的例子(需知道,同样的正则表达式并不能直接套用到不同的语言中),则束手无策。

在正式的出版领域,已经有《精通正则表达式》、 《正则表达式必知必会》之类的书籍出版,尤其是前者,堪称关于正则表达式的经典著作,如果想认真学习正则表达式,这类书籍是必须阅读的。但这类书籍也有一个弱点,即都是由英文版本翻译而来的,更多地侧重英文文本的处理,身为中文世界的开发人员,我们经常需要处理中文文本——对于处理英文之外的字符,正则表达式已经提供了足够丰富的功能,但如何用对、用好这些功能,资料却很匮乏。

我经常需要给人讲解正则表达式的相关知识,时常惋惜的是,开发人员为这些问题所困扰;正因为如此,本书的写作动机便是着力弥补现有资料的缺陷。

相对于正则文档和速成教学帖子,本书深入讲解了匹配背后的原理,往往会举一反三,告诉读者,这里为何这样写,如果改成其他形式,会造成什么结构;并且,集中讲解和比较了多种语言中正则表达式用法的异同,方便读者把现成的正则表达式“移植”到自己的工作环境中。

相对于《精通正则表达式》等正式的书籍,本书辟出专门的内容讲解语言和编码,告诉读者如何设定编码,如何正确处理中文等字符。另外,本书还涵盖了.NET、 Java、 JavaScript、 PHP、Python、Ruby 六种常用语言,对每种语言给出专门章节,不但详细介绍了语言中正则表达式的用法,更点明了版本之间的细微差异,不但可以作为专门学习的教材,还可以成为有用的参考手册。本书结构

本书可以分为三大部分。

第一部分主要讲解正则表达式的基础知识,覆盖常见正则表达式中的各种功能和结构。看完前面3章,就可以基本弄明白现在流行的各种正则表达式;尤其是如果你之前有一些经验,会觉得阅读起来并不困难。但是我也希望读者不要忽略其他的内容,断言和匹配模式现在已经是正则表达式的“标准配备”了,而且确实可以派上大用场,所以第4章和第5章的内容,即便不是很熟悉,阅读起来可能有一些麻烦,也不应该忽略。最后的第6章,则厘清了正则表达式在使用中的若干疑惑,了解它们,你就可以相对自由地在正则表达式的世界里行走了。

第二部分主要讲解关于正则表达式的更深入的知识,这一部分用3章的内容,详细探讨了编码问题、匹配原理、解题思路。这部分内容更抽象,需要多花一点时间来阅读和理解,但是它们确实可以帮你在正则表达式的世界里登堂入室,脱离“术”的层面,掌握万变不离其宗的“道”。

第三部分的作用是接地气,将之前介绍的各种知识落实到六种常用语言.NET、Java、JavaScript、PHP、Python、Ruby中来。每一章的开头有正则功能列表,其中的功能都对应着前面部分的讲解,这些功能的具体应用实例,以及不同版本之间的差异,则在章节中详细讲解,每一章的最后还给出了常见任务的示例代码,方便日后查询。在最后,第16章简要介绍了正则表达式在Linux下常用工具vi、grep、awk、sed中的使用,并通过一个实际的例子将这几种工具串起来,对比说明了它们适合解决的问题。

在本书的最后提供了用作参考的3个附录。

附录A是正则表达式的常用功能在不同语言中的比对,希望能给需要在多种语言中使用正则表达式或者移植正则表达式的读者提供一份有用的参考;附录B给出了若干常见的正则表达式,比如匹配邮政编码、身份证号、手机号、QQ号、电子邮件地址等,希望能成为常见问题的“速查手册”;附录C列出了常用正则表达式的工具和资源,方便大家调试自己的正则表达式,以及继续深入学习。本书读者

本书适合以下几类读者。

经常需要进行文本处理(比如日志分析或网络运维)的技术人员。这些读者或许已经熟悉了正则表达式的基本用法,但面对日益复杂化和海量化的数据,阅读本书可以帮助你更准确、更高效地处理文本,提升自己工作的价值。

熟悉常用开发语言的程序员。虽然这些读者不需要专职进行文本处理,但源代码和许多数据其实也是文本,如果不会正则表达式,在偶然遇到处理源代码或文本数据的任务时,往往会产生躺着中枪的无力感。本书第三部分可以帮你迅速找到有关的例子,并落实在自己的编程语言中。当然前两部分也非常有必要,因为它们可以帮你夯实基础。

对正则表达式已经有一定了解的读者。这些读者虽然能用正则表达式解决常见的任务,但未必了解正则表达式的编码问题、匹配原理、解题思路,仔细阅读本书的第二部分,可以深化完善对正则表达式的理解;而第三部分详细比较了使用正则表达式时各种语言,以及同一种语言中各种版本的差异。所有这一切,应该可以让你对正则表达式的掌握更上一层楼。致谢

一本书的完成,必然离不开众多人的帮忙。

首先需要感谢的是周筠老师和徐定翔、卢鸫翔两位编辑,他们在我写作的最初阶段做了大量细心、耐心的工作,完全可以说,没有他们的这些工作,我就不会有写作这本书的念头,或者坚持写完的动力。

然后要感谢的是电子工业出版社的杨福平副总编和张月萍编辑,没有他们的关照和辛劳工作,这本书的出版定然会遇到更多的困难。

感谢我的朋友霍炬和韩磊,虽然我之前阅读过《精通正则表达式》,但与翻译和写作结缘,他们给了我莫大的帮助,有了这个契机,才有了现在的《正则指引》。尤其值得一提的是霍炬的夫人西乔,精心手绘了这本书的封面,在这里表示诚挚的谢意。

感谢我曾工作过的盛大创新院以及创新院的各位同事(李骏、郝培强、庄表伟、丁宇、许式伟、莫华枫、李道兵、赵劼、樊一鹏、张一宁等),创新院给了大家宽松自由的工作环境,与各位同事的讨论加深了我对正则表达式的理解,也为我提供了许多例子。

感谢张东亮、陆亦斌、孙勇、叶劲峰等各位朋友,愿意拨冗阅读本书的草稿,并提出了大量专业的意见。

感谢何源、陈钢、贺钧、陈驰等读者,试读本书之后提出了大量的宝贵意见,在最后关头打消了我心中的许多忐忑。

在更早之前,我的父母从小就鼓励我研究和了解各种科学原理(“玩也要动脑筋”),我之所以有兴趣探究正则表达式背后的世界,而不满足于“够用/凑合”,归源都是受益于这种思维行为习惯。此外,在中小学阶段,我的语文老师罗碧玉、郭志鸿、易玺铭培养了我对于文字的兴趣,在大学阶段,东北师范大学文学院的王确老师给了我这个理科生非常多的帮助和指引。对各位师长,在此一并表示感谢,能遇到你们是我的幸运。

最后还需要感谢许多为这本书做出过贡献的人,你们的名字我可能暂时无法记起,或者无法一一罗列,但我会在心中存留对你们的谢意。第一部分第1章 字符组1.1 普通字符组[1]

字符组(Character Class)是正则表达式最基本的结构之一,要理解正则表达式的“灵活” ,认识它是第一步。

顾名思义,字符组就是一组字符,在正则表达式中,它表示“在同一个位置可能出现的各种字符” ,其写法是在一对方括号[和]之间列出所有可能出现的字符,简单的字符组比如、在解决一些常见问题时,使用字符组可以大大简化操作,下面举“匹配数字字符”的例子来说明。

字符可以分为很多类,比如数字、字母、标点等。有时候要求 “只出现一个数字字符” ,换句话说,这个位置上的字符只能是这10个字符之一。要进行这种判断,通常的思路是:用10个条件分别判断字符是否等于这10个字符,对10个结果取“或” ,只要其中一个条件成立,就返回True,表示这是一个数字字符,其伪代码如例1-1所示。

例1-1 判断数字字符的伪代码

注:因为正则表达式处理的都是“字符串” (String)而不是“字符” ,所以这里假设变量charStr(虽然它只包含一个字符)也是字符串类型,使用了双引号,在有些语言中字符串也用单引号表示。

这种解法的问题在于太烦琐——如果要判断是否是一个小写英文字母,就要用||连接26个判断;如果还要兼容大写字母,则要连接52个判断,代码长到几乎无法阅读。相反,用字符组解决起来却异常简单,具体思路是:列出可能出现的所有字符(在这个例子里就是10个数字字符) ,只要出现了其中任何一个,就返回True。例1-2给出了使用字符组判断的例子,程序语言使用Python。

例1-2 用正则表达式判断数字字符

re.search()是Python提供的正则表达式操作函数,表示“进行正则表达式匹配” ;charStr仍然是需要判断的字符串,而则是以字符串形式给出的正则表达式,它是一个字符组,表示“这里可以是中的任意一个字符。只要charStr与其中任何一个字符相同(或者说“charStr可以由匹配” ) ,就会得到一个MatchObject对象(这个对象暂时不必关心,在第21页会详细讲解) ;否则,返回None。所以判断结果是否为None,就可以判断charStr是否是数字字符。

当今流行的编程语言大多支持正则表达式,上面的例子在各种语言中的写法大抵相同,唯一的区别在于如何调用正则表达式的功能,所以用法其实大同小异。例1-3列出了常见语言中的表示,如果你现在就希望知道语言的细节,可以参考本书第三部分的具体章节。[2]

例1-3 用正则表达式判断数字字符在各种语言中的应用

可以看到,不同语言使用正则表达式的方法也不相同。如果仔细观察会发现Java、.NET、Python、PHP中的正则表达式,都要以字符串形式给出,两端都有双引号;而Ruby和JavaScript中的正则表达式则不必如此,只在首尾有两个斜线字符,这也是不同语言中使用正则表达式的不同之处。不过,这个问题现在不需要太关心,因为本书中大部分例子以Python程序来讲解,下面讲解关于Python的基础知识,其他语言的细节留到后文会详细介绍。1.2 关于Python的基础知识

本书选择使用Python语言来演示实际的匹配结果,因为它能在多种操作系统中运行,安装也很方便;另一方面,Python是解释型语言,输入代码就能看到结果,方便动手实践。考虑到不是所有人都熟悉Python,这里专门用一节来介绍。

如果你的机器上没有安装Python,可以从http://python.org/download/下载,目前Python有2 和3两个版本,本书的例子以2版本[3]为准。请选择自己平台对应的程序下载并安装(目前MacOS、Linux的各种发行版一般带有Python,具体可以在命令行下输入python,看是否启动对应的程序) 。

然后可以启动Python,在MacOS和Linux下是输入python,会显示出Python提示符,进入交互模式,如图1-1(Linux下的提示符与MacOS下的差不多,所以此处不列出) ;而在Windows下,需要在“开始”菜单的“程序”中,选择Python 目录下的Python(command line),如图1-2所示。图1-1 MacOS下的Python提示符图1-2 Windows下的Python提示符

Python中常用的关于正则表达式的函数是re.search(),使用它必须首先导入正则表达式对应的包(package) ,也就是输入下面的代码。

通常的用法是提供两个参数:re.search(pattern, string),其中pattern是字符串形式提供的正则表达式,string是需要匹配的字符串;如果能匹配,则返回一个MatchObject(详细介绍请参考第241页,暂时可以不必关心) ,这时提示符会显示类似<_sre.SRE_Match object at 0x0000000001D8E578>之类的结果;如果不能匹配,结果是None(这是Python中的一个特殊值,类似其他某些语言中的Null) ,不会有任何显示。图1-3演示了运行Python语句的结果。图1-3 观察re.search()匹配的返回值

注:>>>是等待输入的提示符,以>>>开头的行,之后文本是用户输入的语句;其他行是系统生成的,比如打印出语句的结果(在交互模式下,匹配结果会自动输出,便于观察;真正程序运行时不会如此) 。

为讲解清楚、形象、方便,本书中的程序部分需要做两点修改。

第一,因为暂时还不需要关心匹配结果的细节,只关心有没有结果,所以在re.search()之后添加判断返回值是否为None,如果为True,则表示匹配成功,否则返回False表示匹配失败。为节省版面,尽可能用注释表示这类匹配结果,如# => True或者 # => False,附在语句

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载