[英]DFA vs NFA engines: What is the difference in their capabilities and limitations?
[英]If NFA and DFA were equivalent, why would we have two engines for regex?
從掌握正則表達式 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) 或更差行為的正則表達式,當呈現出與它們不匹配的字符串時。 (見https://swtch.com/~rsc/regexp/regexp1.html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.