Overview of Regular Expression Features and Flavors
现在我们稍微找到点感觉了,也见识了若干使用正则表达式的工具软件,你可能觉得,该坐下来潜心研究研究如何使用它们了。不过,比较比较第1章中不同版本的egrep,或是前一章中Perl程序和Java程序的区别就会发现,工具不同,正则表达式的写法和用法都有很大的不同。
在某种特定的宿主语言或工具软件中使用正则表达式时,主要有3个问题值得注意:
●支持的元字符,以及这些元字符的意义。这通常称为正则表达式的“流派(flavor)”。
●正则表达式与语言或工具的“交互”(interface)方式。譬如如何进行正则表达式操作,容许进行哪些操作,以及这些操作的目标文本类型。
●正则表达式引擎如何将表达式应用到文本。语言或工具的设计者实现正则表达式的方法,对正则表达式能够取得的结果有重要的影响。
正则表达式和汽车
购买汽车时,我们需要考虑的问题和上面 3 点很相似。正则表达式中的元字符是应当首先关注的,它相当于汽车的造型、色彩和内饰,例如CD播放器和真皮座椅。印刷光鲜的宣传册上经常可以见到这些信息,在正则表达式的世界中,与之对应的就是第32页的元字符列表。这些信息很重要,但还不是全部。
正则表达式与宿主语言的交互方式(interface)也很重要。交互方式的一部分内容起到装饰性作用,描述对应的编程语言中正则表达式的应用规则。另一部分内容定义功能,它们决定了语言所能支持的操作,以及操作的难易程度。对应于汽车的例子,它相当于汽车与我们和我们的生活相“结合”的程度。某些问题可能是装饰性的,例如加油口在车的哪一侧,车窗是否能电动升降。其他问题可能重要些,例如是手动变速还是自动变速。还有些关于功能的问题:你的车怎样开进车库?它能装得下一个大号床垫吗?如果是滑雪板呢?或者五个大人?(以及这些人如何进出,在这个问题上四门车显然比两门车有优势)。宣传册会介绍一些此类信息,不过你可能需要阅读封底的小字才能了解所有细节。
最后需要关注的是引擎,以及引擎驱动车轮的原理。汽车的类比在这里不适用,因为大家都理解汽车发动机工作的基本知识:如果是汽油发动机,人们就不会往油箱里加柴油。如果是手动变速,他们不会忘记踩离合器。但是,在正则表达式的世界中,即使是一些最基本的知识:例如正则引擎的匹配原理,以及该原理对表达式的调校和使用的影响,通常都没有文档介绍。但是,这些细节对实际使用正则表达式又极其重要,所以我们会在下一章用整章的篇幅来讲解。
本章的内容
如标题所示,这一章讲解正则表达式的特性和流派。它介绍了经常使用的元字符,以及在具体的工具软件中使用正则表达式的方式。这些内容涵盖了上文提到的前面两点。第三点——正则引擎是如何工作的,这些工作原理有什么实际意义——会在下面的几章中涉及。
关于本章,我要说的一点是,它并不能告诉你某种工具软件中的正则表达式提供了哪些特性,也不会教育你如何使用在提过的各种工具软件和编程语言中运用正则表达式。相反,它的目的是,提供关于正则表达式本身和使用它的工具软件的完整图景。如果我们与世隔绝,只使用一件工具,或许不需要关心其他的工具(或者是该工具的其他版本)有什么差异。但现实情况并非如此,所以了解我们所用工具的技术渊源,或许能够提供有趣而又有价值的启示。