转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html

目前常见的正则表达引擎总体分为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(大多数版本)、flexlex、MySQL、Procmail 不支持 不支持 不支持
传统型 NFA GNU Emacs、Java、grep(大多数版本)、lessmore、.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 支持

转载请注明出处 https://www.cnblogs.com/majianming/p/11823697.html

NFA 、DFA 简述的更多相关文章

  1. 编译系统中的 NFA/DFA算法理解

    1.问题概述 NFA 和 DFA浅析---要深入了解正则表达式,必须首先理解有穷自动机. 有穷自动机(Finite Automate)是用来模拟实物系统的数学模型,它包括如下五个部分: 有穷状态集St ...

  2. NFA/DFA算法

    1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...

  3. 编译原理--NFA/DFA

    现成的, 讲义: https://www.cnblogs.com/AndyEvans/p/10240790.html https://www.cnblogs.com/AndyEvans/p/10241 ...

  4. 编译原理实验 NFA子集法构造DFA,DFA的识别 c++11实现

    实验内容 将非确定性有限状态自动机通过子集法构造确定性有限状态自动机. 实验步骤 1,读入NFA状态.注意最后需要设置终止状态. 2,初始态取空,构造DFA的l0状态,将l0加入未标记状态队列que ...

  5. 什么是NFA(不确定的有穷自动机)和DFA(确定的有穷自动机)

    本节知识点是<编译原理>第三章-词法分析,学习参考教材为清华大学出版社<编译原理>第三版: 前情提要: 字母表∑1和∑2的乘积( product): ∑1∑2 ={ab|a ∈ ...

  6. NFA和DFA的区别

      NFA DFA 初始状态 不唯一 唯一 弧上的标记 字(单字符字/ε) 字符(串) 转换关系 非确定 确定 对于每个NFA M都存在一个DFA M' 使得 L(M) = L(M')

  7. NFA引擎匹配原理

    1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动听的乐曲,但他/她或 ...

  8. 正则表达式: NFA引擎匹配原理

    NFA引擎匹配原理 1       为什么要了解引擎匹配原理 一个个音符杂乱无章的组合在一起,弹奏出的或许就是噪音,同样的音符经过作曲家的手,就可以谱出非常动听的乐曲,一个演奏者同样可以照着乐谱奏出动 ...

  9. 编译原理-词法分析05-正则表达式到DFA-01

    编译原理-词法分析05-正则表达式到DFA 要经历 正则表达式 --> NFA --> DFA 的过程. 0. 术语 Thompson构造Thompson Construction 利用ε ...

随机推荐

  1. [转]Windows 10 无法访问共享的解决办法大全

    本文前面介绍 Windows 10 操作系统无法访问其他电脑的共享文件夹,而其他电脑访问该共享可以访问的解决办法. 简单点说就是,你的操作系统是 Win10 ,你访问不了某台电脑的共享,但是别人可以. ...

  2. kafka-consumer.properties

    # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreement ...

  3. window安装oracle和创建数据库

    原文地址: https://www.cnblogs.com/hoobey/p/6010804.html  #11g安装 https://www.cnblogs.com/qq1272850043/p/6 ...

  4. Docker问题方案收集

    1.问题: Unable to connect to unix:///var/run/docker.sock (Permission denied) from PHP code 解决方法: Make ...

  5. 2018-2019 2 20165203 《网络对抗技术》Exp9 Web安全基础

    2018-2019 2 20165203 <网络对抗技术>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理,做不少于7个题目,共3.5分.包括(SQL,XSS ...

  6. HDU4762 Cut the Cake

    HDU4762 Cut the Cake 思路:公式:n/m(n-1) //package acm; import java.awt.Container; import java.awt.geom.A ...

  7. 关于CSS中的单位px、em、rem

    首先,px.em.rem都是相对单位: px(pixel像素)是相对于显示器屏幕分辨率的,IE无法调整那些使用px作为单位的字体大小: em是相对于当前对象内文本字体的尺寸,如当前对行内文本的字体尺寸 ...

  8. 测开之路三十五:css引入

    CSS是一种定义样式结构,如字体.颜色.位置等的语言,被用于描述网页上的信息格式化和现实的方式.CSS样式可以直接存储于HTML网页或者单独的样式单文件.无论哪一种方式,样式单包含将样式应用到指定类型 ...

  9. hive中not in优化

    比如:A,B两表,找到ID字段中,存在A表,但不存在B表的数据. A表共13w,去重后3w,B表共2W,且有索引 方法一 not in,易理解,效率低,时间:1.395s )

  10. python2.7.13标准库文件目录操作与文件操作

    标准库的中文参考文档: http://python.usyiyi.cn/translate/python_278/library/index.html 官方标准库文档:https://docs.pyt ...