正则表达式 引擎分类

2022-08-28 19:44:54 浏览数 (1)

正则表达式分类如下:

引擎类型

程序

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总是返回最左最长匹配)
  • 占有优先量词
  • 固化分组

0 人点赞