Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果NFA和DFA是等效的,为什么我们要为regex配备两个引擎?_Regex_Dfa_Nfa - Fatal编程技术网

如果NFA和DFA是等效的,为什么我们要为regex配备两个引擎?

如果NFA和DFA是等效的,为什么我们要为regex配备两个引擎?,regex,dfa,nfa,Regex,Dfa,Nfa,从掌握正则表达式3e开始: 因此,广义而言,有三种类型的正则表达式引擎: DFA(POSIX或两种方式不类似) 传统的NFA(最常见的:Perl、.NET、PHP、Java、Python等) POSIX NFA 根据计算理论:形式语言、自动机和复杂性: 对于每个NFA,都有一个接受完全相同语言的DFA 我能说NFA和DFA是一回事吗?或者,尽管它们识别模式的能力相当,但它们在某些方面仍然不同?您缺少两件事: “传统的NFA”实现实际上包括NFA的严格计算机科学定义之外的能力 性能特性是一个需

从掌握正则表达式3e开始:

因此,广义而言,有三种类型的正则表达式引擎:

  • DFA(POSIX或两种方式不类似)
  • 传统的NFA(最常见的:Perl、.NET、PHP、Java、Python等)
  • POSIX NFA
根据计算理论:形式语言、自动机和复杂性:

对于每个NFA,都有一个接受完全相同语言的DFA


我能说NFA和DFA是一回事吗?或者,尽管它们识别模式的能力相当,但它们在某些方面仍然不同?

您缺少两件事:

  • “传统的NFA”实现实际上包括NFA的严格计算机科学定义之外的能力

  • 性能特性是一个需要关注的问题,即使给定两个实现包含相同的答案


  • 最终的效果是回溯实现(我更喜欢这个名字,而不是“传统的NFA”)比DFA实现更具表现力,因为它们可以匹配正则表达式,比如
    (\w{3,})\1
    ,它匹配三个或更多重复两次的单词字符(DFA无法匹配)。同时,DFA实现在输入长度上保证为O(n),但当使用不匹配的字符串表示时,很容易编写具有O(n^2)或更糟糕行为的正则表达式。(请参阅)

    您可以构造接受相同语言的DFA,这并不意味着它们“相同”。它们的操作方式不同,这就是它们的不同之处。请参见此处:读取的可能重复