目前常见的正则表达引擎总体分为2种,DFA (确定型有穷状态自动机) 和 NFA (非确定型有穷状态自动机)

如果细分,NFA 可以分为传统NFA和POSIX NFA

那么如何区分3者

如果某种正则引擎如果他不能匹配能很快给出结果,那么他可能是DFA

如果只有在能够匹配的时候才能快速给出结果,那么就是传统NFA

如果无论能不能匹配,匹配的时间都基本一致,那么就是POSIX NFA

why ?

首先先看 DFA,DFA 是文本主导的表达式引擎,实际上,对于确定的DFA表达式,状态的个数是确定的,这个也是为什么是确定型有穷状态

通过DFA 表达式,可以分析出所有可能的匹配路径,也就是说,在匹配还没开始的时候,所有路径都已经确定了(如果遇到某个字符 就走某个指定的路径),接下来需要做的就是在匹配文本,然后删掉不符合的路径,如果中途存在没有的路径,那么匹配失败,如果到最后存在多条匹配成功的路径,那么取匹配最长的路径

另外DFA 不支持反向引用和环视

而NFA 是表达式主导的引擎,也就是说实际上是拿文本到表达式测试,如果成功就继续匹配,失败就回溯或者选择其他分支或者报告匹配失败

在NFA中分为两种引擎,传统NFA和POSIX NFA

传统NFA和POSIX NFA的区别是传统NFA 如果如果找到一个匹配,那么就会直接报告这个匹配,POSIX NFA会尝试所有可能的匹配,如果有多个匹配,返回最长最左的匹配

所以在能够匹配的时候NFA 只需要找到一个匹配就能返回了,相对速度会很快,因为POSIX NFA 需要尝试所有可能才会报告是否匹配成功,所以时间是一致的。

引擎类型

程序

忽略优先量词(懒惰)

捕获型括号

回溯

DFA

awk(大多数版本)、egrep(大多数版本)、flex、lex、MySQL、Procmail

不支持

不支持

不支持

传统型 NFA

GNU Emacs、Java、grep(大多数版本)、less、more、.NET 语言、PCRE library、Perl、PHP(所有三套正则库)、Python、Ruby、sed(大多数版本)、vi

支持

支持

支持,但性能差

POSIX NFA

mawk、Mortice Kern Systems’utilities、GNU Emacs(明确指定时使用)

不支持

支持

支持,但性能差

DFA/NFA 混合

GNU awk、GNU grep/egrep、Tcl

支持

支持

DFA 支持

java nfa dfa_NFA 、DFA 简述相关推荐

  1. java nfa dfa_NFA转换为DFA

    五一之后就开始实习了,接触的第一件事就是解析正则,于是开始学习正则转DFA的知识.看了很多帖子,始终在状态move中的解析一带而过,最终在网易云课堂的一门课中找到答案.http://study.163 ...

  2. java nfa dfa_DFA与NFA

    正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机),另一类称为NFA(非确定性有穷自动机).两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去.DFA捏着文本串去比较 ...

  3. 编译原理——实现NFA到DFA 的转换(子集构造法)

    一.实验内容 利用⼦集构造法的实现任意NFA到DFA 的转换. 二.编程思路: 建立一个NFA类,包括初始状态,输入,下一状态: 建立一个DFA类,包括初始状态,输入,下一状态: 建立init()函数 ...

  4. 词法分析(NFA与DFA)

    词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说 ...

  5. NTU 课程辅助笔记: NFA到DFA的转化

    我们以这张图为例: 用 Finite State Machine Designer - by Evan Wallace (madebyevan.com) 画的,有几条边的mark没画好错位了 1 写出 ...

  6. 词法分析(4)---NFA与DFA的转化

    1. 子集构造(Subset Construction) 这是一个转换NFA到DFA的算法.我们知道NFA和DFA的区别最主要的就是一个状态和一个input symbol是否能够确定一个状态的问题,对 ...

  7. nfa状态转换图正规式_0x02 从NFA到DFA

    书接上文,上回说道NFA已经可以完全描述正则语言的全部内容.那么,我们在这一章探索一下一个比较复杂的正则表达式在用NFA做匹配的时候会有什么"不足". NFA匹配的"不足 ...

  8. python 求子字符串_求子串-KPM模式匹配-NFA/DFA

    求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...

  9. NFA转DFA程序设计

    实验二:利用子集构造法实现NFA到DFA的转换 [问题描述]利用子集构造法实现NFA到DFA的转换.NFA的确定化 [输入形式]NFA 参见样例.其中,第一列表示状态名,终状态用f表示:第二列和第三列 ...

最新文章

  1. C语言-main方法的两个参数是干什么的?
  2. aspx网页背景图片设置代码_python 30行代码自动填写问卷(单选题和多选题)
  3. Quartz.Net - Lesson 1: 使用Quartz
  4. php小程序群发通知,小程序实现群发功能代码的实现
  5. 随机过程及其稳态stability
  6. 艾伟:彻底解决刷新重复提交问题,你还在用Response.Redirect吗?
  7. c语言动态指针数组--一种伪二维数组
  8. mysql5.5安装最后一步一直无反应_吉林电泳型材安装
  9. python播放音频文件
  10. PGMIntro概率图模型
  11. 法院拍卖房产税费由谁承担
  12. 有没有什么帮助睡眠的东西?助眠效果好的东西分享
  13. 谈谈一只菜鸟转行Erlang游戏服务端的经历(希望大佬指导,也希望我的经历能给一些还未毕业的同学或者正在迷茫自己工作内容的同学一些感触)
  14. 大脑的无限存储与记忆传输
  15. Matlab App Designer 学习笔记
  16. 在嵌入式linux上玩OpenGL
  17. C语言编写Johnson-Trotter算法生成排列
  18. 详解爬电距离和电气间隙
  19. 腾讯云服务器无法通过密钥登录
  20. Spring 夺命 35 问!

热门文章

  1. ppp 完全理解(一)
  2. Tornado的Application
  3. AndroidStudio offlineWork
  4. 比特安审计中心:揭开安全审计的神秘面纱
  5. (Java)7-2 sdut-String-1 识蛟龙号载人深潜,立科技报国志(I)
  6. a4504光耦怎么检测好坏_如何检测光耦的好坏
  7. 基于MuPDF和Qt的PDF阅读器的开发
  8. mysql urldecode_urlencode()与urldecode()函数
  9. SoftReference 介绍
  10. Linux挂载(mount,umount及开机自动挂载