正则表达式引擎分成两类,一类称为DFA(确定性有穷自动机),另一类称为NFA(非确定性有穷自动机)。两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去。DFA捏着文本串去比较正则式,看到一个子正则式,就把可能的匹配串全标注出来,然后再看正则式的下一个部分,根据新的匹配结果更新标注。而NFA是捏着正则式去比文本,吃掉一个字符,就把它跟正则式比较,匹配就记下来:“某年某月某日在某处匹配上了!”,然后接着往下干。一旦不匹配,就把刚吃的这个字符吐出来,一个个的吐,直到回到上一次匹配的地方。

DFA与NFA机制上的不同带来5个影响:
  1. DFA对于文本串里的每一个字符只需扫描一次,比较快,但特性较少;NFA要翻来覆去吃字符、吐字符,速度慢,但是特性丰富,所以反而应用广泛,当今主要的正则表达式引擎,如Perl、Ruby、Python的re模块、Java和.NET的regex库,都是NFA的。
  2. 只有NFA才支持lazy和backreference等特性;
  3. NFA急于邀功请赏,所以最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果;DFA则是“最长的左子正则式优先匹配成功”。
  4. NFA缺省采用greedy量词(见item 4);
  5. NFA可能会陷入递归调用的陷阱而表现得性能极差。

例如用正则式/perl|perlman/来匹配文本 ‘perlman book’。如果是NFA,则以正则式为导向,手里捏着正则式,眼睛看着文本,一个字符一个字符的吃,吃完 ‘perl’ 以后,跟第一个子正则式/perl/已经匹配上了,于是记录在案,往下再看,吃进一个 ‘m’,这下糟了,跟子式/perl/不匹配了,于是把m吐出来,向上汇报说成功匹配 ‘perl’,不再关心其他,也不尝试后面那个子正则式/perlman/,自然也就看不到那个更好的答案了。

如果是DFA,它是以文本为导向,手里捏着文本,眼睛看着正则式,一口一口的吃。吃到/p/,就在手里的 ‘p’ 上打一个钩,记上一笔,说这个字符已经匹配上了,然后往下吃。当看到 /perl/ 之后,DFA不会停,会尝试再吃一口。这时候,第一个子正则式已经山穷水尽了,没得吃了,于是就甩掉它,去吃第二个子正则式的/m/。这一吃好了,因为又匹配上了,于是接着往下吃。直到把正则式吃完,心满意足往上报告说成功匹配了 ‘perlman’。

由此可知,要让NFA正确工作,应该使用 /perlman|perl/ 模式

JS的正则引擎是NFA,NFA是“非确定型有限自动机”的简写。

大部分语言中的正则都是NFA,为啥它这么流行呢?

答:你别看我匹配慢,但是我编译快啊,而且我还有趣哦。

转载于:https://www.cnblogs.com/fpcbk/p/11004913.html

DFA和NFA的区别相关推荐

  1. DFA和NFA的五元组定义,DFA和NFA的区别

    1.DFA的五元组定义:  DFA是一个确定有限自动机DFA, M是一个五元组  M = (S,∑,M,S0,F)  S: state非空有穷状态集合  ∑: 字母表,可输入符号  S0:start唯 ...

  2. 一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简

    有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA. 确定有穷自动机(DFA) 形式定义: 表示形式为: 注意:终态是用两个圆圈表示的,图中的3号即为D ...

  3. 确定与不确定有限自动机DFA与NFA及子集法互相转换

    编译原理正规式NFA与DFA及子集法 1.基础术语与概念: 语法描述基本概念 字母表:一个有穷字符集记为Σ 字母表中每个元素称为字符 Σ上的字(字符串)是指Σ中的字符所构成的一个有穷序列 不包含任何字 ...

  4. 对于DFA、NFA理解

    最近在做深度包检测课题时,需要学一些新的算法: DFA.NFA,对这两个算法进行一下小的总结: 有穷状态自动机 一听这个名字感觉很高大上,很陌生,不知道是什么意思,但是可以分开来理解.有穷,也就是说这 ...

  5. 编译原理——词法分析(3)有穷自动机中DFA与NFA的理解

    1.1词法分析器生成工具Lex 虽然在学习上,我们学习的是Lex,但是最近经常使用的是词法分析器生成工具是Flex,它可以为C语言生成代码,Vern Paxson于1987年以C语言写作了Flex,他 ...

  6. 正规式到nfa dfa java_正规式与正规集,DFA与NFA

    词法分析器的设计 词法分析器的功能:输入源程序.输出单词符号 词法分析器的设计:给出程序设计语言的单词规范--单词表, 对照单词表设计识别该语言所有单词的状态转换图, 根据状态转换图编写词法分析程序 ...

  7. 【编译原理笔记03】词法分析:正则表达式、有穷自动机(FA)、DFA与NFA及RE的相互转换、DFA识别单词、语法检测

    本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA 文章目录 ...

  8. 形式语言和自动机总结DFA、NFA

    第一章DFA 形式定义和状态转移函数: DFA是一种特殊的NFA, A={Q,,,,F} Q:输入状态集,∑:字母表,δ:状态转移函数Q×∑→Q q0∈Q初始状态 F终结集 设计举例 1.设计接受偶数 ...

  9. DFA与NFA的比较

    正则表达式的规则很容易理解,但是正则表达式并不能直接用来解析字符串,我们还要引入一种适合转化为计算机程序的模型.今天我们引入的这种模型就叫做有穷自动机(finite automation,FA),有时 ...

最新文章

  1. android studio 修改程序包名
  2. Elasticsearch 节点发现
  3. 分割等和子集—leetcode416
  4. PHP客户端缓存控制
  5. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析
  6. ajax 与route的区别,浅析vue-router jquery和params传参(接收参数)$router $route的区别
  7. 信号槽绑定时出现未有匹配的connect()函数
  8. 《大数据》第1期“论坛”——数据技术时代的未来
  9. Python实现微信朋友签名云图项目
  10. windows jdk8
  11. 多语言页面语言标签的使用更适合推广
  12. oracle 进入empt,关于redhat6.2静默安装oracle11g出现的问题 大神救命
  13. qt样式表设置边框_Qt样式表之 QSS 语法介绍
  14. 把AppData目录挪到D盘的方法方法
  15. 【半年总结】蓦然回首
  16. CTS2019朝圣 x 打铁记
  17. 工人物语5战役攻略_工人物语5_工人物语5专区_工人物语5下载_逗游网
  18. UE4 制作玻璃材质总结
  19. 292 炮兵阵地(状态压缩dp)
  20. mycncart如何开启短信验证接口功能

热门文章

  1. SPOJ 4487. Can you answer these queries VI splay
  2. struts2入门操作
  3. linux学习之用户的切换
  4. shell脚本的学习(二)
  5. 10.24 环境变量PATH,cp,mv,文档查看cat/more/less/head/tail
  6. Redis+Keepalived内存数据库集群配置
  7. 【结构型】Bridge模式
  8. _过程_函数_触发器_游标
  9. Scala学习(六)练习
  10. 使用微信支付购买《微信公众平台最佳实践》