Summary
如果你希望一遍就能读懂本章的所有内容,大概得做点准备。至少,这些东西不那么容易理解。我花了些时间才理解它,花了更长的时间才真正弄懂。我希望这章简要的讲解能够降低读者理解的难度。我尝试过简单地解释,同时不要调入太简单的陷阱(不幸的是,太过直白的解释总是妨碍了真正的理解)。本章有许多这样的陷阱,所以我在其中安排了许多对其他页的引用,在下面的摘要中,读者可以很快地找到其他的内容。
实现正则表达式匹配引擎有两种常见的技术,一种是“表达式主导的NFA”(☞153),另一种是“文本主导的DFA”(☞155)。它们的全称见第156页。
这两种技术,结合POSIX标准,可以按照实用标准划分3种正则引擎:
●传统型NFA(汽油驱动,功能强大)。
●POSIX NFA(汽油驱动,符合标准)。
●DFA(不一定符合POSIX)(电力驱动,运转稳定)。
为了对手头的工具有个大致的了解,你需要知道它采用的是什么引擎,以对正则表达式做相应的调校。最常见的引擎就是传统型NFA,其次是DFA。表4-1(☞145)列出了若干常用工具及它们使用的引擎类型,“测试引擎的类型”(☞146)给出了测试引擎类型的方法。
对于任何引擎来说,都有一条通用的规则:开始位置靠先的匹配文本优先于开始位置靠后的匹配文本。因为“传动机构”会从前往后在文本的各个位置展开尝试(☞148)。
对于从某个位置开始的匹配:
文本主导的DFA引擎:
寻找可能的最长的匹配文本。不再介绍(☞177)。稳定、速度快(☞179),讲解起来很麻烦。
表达式主导的NFA引擎:
匹配过程中可能需要“反复尝试(work through)”。NFA匹配的灵魂是回溯(☞157,162)。控制匹配过程的元字符:标准量词(星号等等)是匹配优先的(☞151),其他量词是忽略优先或者占有优先的(☞169)。在传统型NFA中,多选结构是有序排列的(☞174),在POSIX NFA中是匹配优先的。
POSIX NFA 必须找到最长的匹配文本。但是,匹配并不难理解,只须考虑效率(第6章的问题)。
传统型NFA 控制能力最强的正则引擎,因此使用者可以使用该引擎的表达式主导性质来精确控制匹配过程。
理解本章的概念和练习是书写正确而高效的正则表达式的基础,这也是接下来两章的主题。