正则表达式分类如下:
引擎类型 | 程序 |
---|---|
DFA | awk, egrep, flex, lex, MySQL |
传统型NFA | Java, grep, less, more, Perl, Python |
POSIX NFA | mawk, GNU Emacs |
DFA/NFA 混合 | GNU awk, grep |
两条普适规则:
- 优先选择最左端的匹配结果
- 标准的匹配量词(*, ,?, {m, n})是匹配优先的
区别
引擎原理
NFA是表达式主导,目标文本的某个字符可能被正则表达式中的不同部分重复检测。
DFA是文本主导,DFA引擎在扫描字符串时,会记录“当前有效”的所有匹配可能,因此目标文本中的每个字符最多只会检查一遍。
编译阶段
在使用正则表达式前,两种引擎都会编译表达式。NFA的编译会快一些,内存使用较少。
匹配速度
传统NFA在匹配失败前,必须尝试正则表达式所有变体。
POSIX NFA必须总是尝试所有正则表达式变体,以找到最长的匹配文本。
DFA对目标文本中的每个字符最多只检查一次,匹配速度极快。
匹配结果
DFA和POSIX NFA返回最左最长的匹配文本,传统NFA可能返回其他结果。
匹配能力
NFA提供一些DFA不支持的功能:
- 捕获括号内的子表达式文本,并支持反向引用
- 环视
- 忽略优先两次,以及有序的多选结构(DFA总是返回最左最长匹配)
- 占有优先量词
- 固化分组