定义
NFA与DFA是正则表达式引擎所使用的两种基本技术:
NFA:非确定型有穷自动机
DFA:确定型有穷自动机
作者用用电动机来比喻DFA,用汽油机来比喻NFA,他们确实有许多相似之处:
1.汽油机的历史更长,NFA的历史也比DFA长
2.汽油机应用更加广泛,NFA的应用也比DFA更加广泛
3.汽油机可分为达到加利福尼亚州的尾气排放标准(更严格)和没有达到两种,NFA也分为POSIX NFA和传统型NFA,POSIX NFA是为了规范正在表达式的使用,也是一种新标准。
因此,正则表达式的引擎实际上可以分为三种:
DFA
传统型NFA
POSIX NFA
还有一类特殊的的引擎类型,就是DFA与NFA混合,如:
GNU grep/egrep、Tcl、GUN awk。
我们所使用的许多语言都是用的传统型NFA,比如Java、Perl、Python、PHP、Ruby等。
测试引擎类型
有时候并不知道我们使用的工具是那种类型,可以用几个测试用的表达式来分辨引擎的类型
1.看是否支持忽略优先量词,如果支持,基本就能确定是传统型NFA:
用正则表达式:nfa|nfa not 来匹配字符串 nfa not,如果匹配结果是nfa,就是传统型NFA
2.如果第一步不匹配,再试捕获型括号,DFA不支持捕获型括号和回溯,当然,也可能会遇到同时使用两种引擎的混合系统,在这种系统中,如果没有使用捕获型括