截至上篇为止,我们学习了正则表达式的基本用法,包括捕获,引用,环视和量词匹配等。可以说,对于正则表达式的学习,我们已经到了一个不错的地步,但是就如博主博客上面所写的那样,“君子务本,本立而道生”,学习任何一个东西,都要想办法弄清楚最核心的部分,这样才能真正的学会,进而在使用中才能得心应手。
那么对正则表达式来说,它最核心的东西是什么呢?答案是引擎。正则表达式因为其漫长的历史而衍生出了不同的流派,这些不同的流派使用不同的引擎,这些引擎彼此提供了不完全一样的语法支持,甚至对于某个相同的表达式匹配任务,也会有不同的结果。了解引擎有助于我们更深入的了解我们所写的正则表达式匹配。
严格的说,有三种正则表达式的引擎,一种是最传统的NFA,历史最为悠久,.Net,PHP,Ruby等语言中所集成的正则表达式均使用NFA引擎。第二种是DFA,主要被egrep,awk,lex和flex支持。最后一种是满足Posix标准的NFA,这是什么呢,简而言之,就是一种对NFA引擎的规则,规定NFA引擎必须满足某些行为以符合POSIX标准。他们各自的特点如下:
引擎名称 | 程序 | 匹配特点 |
NFA | .Net,PHP,Ruby,Java等 | 回溯,最左匹配 |
POSIX NFA | mawk | 最长匹配 |
DFA | egrep,awk等 | 无捕获,无回溯,最长匹配,不支持忽略优先量词 |