這是來自研究項目的DFA。我們手動創建了DFA。我們感興趣的是與DFA對應的正則表達式。當然,可能有多個 正則表達式對應於它;我們更喜歡更簡單的一個。與此DFA對應的正則表達式是什麼?
回答
傑克,基本上可以有兩個正則表達式這個DFA。 第一個可以是AB * CD * A, 第二可AE * F *
10*110*
是用於從ABCD轉變而不在Cb上的環
1(0*(10)*)*110*
我認爲也包括C和B
0+10*1
是來自AEF的循環。所以,你可以把它前面以兩個表達式
你得到(0+10*1)*10*110*
不循環,(0+10*1)*1(0*(10)*)*110*
它
最終的表達是這樣
(0+10*1)*1(0*(10)*)*110*
從一個過渡到d
最後在達到D狀態時,您可以獲得1
,達到A
,並重復整個過程
((0+10*1)*1(0*(10)*)*110*)(1((0+10*1)*1(0*(10)*)*110*))*
See it in action爲這個DFA
澄清一些有效和無效的字符串 - 這正則表達式是基於正則表達式由PCRE所接受。所以+
意味着串1點或多個正好和*
指0或多個正好,而|
意味着OR
編輯的(0*(10)*)*
可以爲(0|(10))*
(感謝編寫更好@ grijesh,肖漢爲指向我在這個方向)。因此,RE(基於PCRE)將是
((0+10*1)*1(0|(10))*110*)(1((0+10*1)*1(0|(10))*110*))*
您需要使用的算法描述爲here。如果您對該主題更感興趣,我強烈建議您閱讀Michael Sipser的Introduction to the Theory of Computation。
爲您的特定DFA,該算法以下你得到這個表達式:
[(010*1)*1(10*)110*1]*(010*1)*1(10)*110*
你的正則表達式是非常接近的DFA。通過將您的正則表達式繪製到DFA,缺少從D到A的轉換。 – JackWM
對不起,修好了。很顯然,這是由計算機完成的,因爲犯錯很容易。 –
你必須在B和E.錯過了標籤在你DFA自我循環,但因爲你說對於給定的DFA然後兩個迴路上的標籤的唯一選擇是0
。
正確的正則表達式的DFA是:
(00* 10*1)* (1(0 + 10)* 1 1) (0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1)*
的簡要說明:
你只有一個那就是
D
最終狀態。所以如果字符串在D
結束,字符串可以被接受。 您注意到D
上的傳入邊緣被標記爲1
而D
具有標記爲0
的自我循環。起始狀態爲
A
所以字符串可以用0
或1
開頭。實際上在A上有兩個循環。一個以0
開頭,並穿過上面的圖表。
RE爲上部循環爲:00* 10*1
爲了理解這一點:
0 0* 1 0* 1 A-E loop on E E-F loop on F F-A
從
A
去D
在下方的曲線圖。 RE是1 (0 + 10)* 1 1
要理解這一點:1 (0 + 10)* 1 1 A - B loop on B B-C C-D
的DFA完整的RE是:(答案)
(00* 10*1)* (1(0 + 10)* 1 1) (0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1)*
要理解這一點:
(00* 10*1)* (1(0 + 10)* 1 1) (0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1)* ^ ^ ^ upper loop A to D loop on D * for loop on D (0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1 )* ^ D-A A-A A-B loop on B, B-c c-D self loop on D
編輯作爲@RedBaron評論執行此正則表達式生成的字符串01110100110
:
以及拳頭檢查它由DFA或不接受:
A - 0 - >電子 - 1 --- > F - 1 ---> A --- 1 ---> B - 0 ---> B --- 1 ---> C --- 0 --- - > B --- 0 ---> B -1 - > C --- 1 ---> D --- 0 ---> D
是字符串被DFA接受。
如何從RE生成我給出了答案,下面我已經對齊RE和字符串。
(00* 10*1)* (1(0 + 10)* 1 1) (0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1)*
0^ 1^ 1 1 0100 1 1 0
只有你可能有難度的理解:如何(0 + 10)*
產生0100
?下面這個檢查:
(0 + 10)*
被重複了三次:
(0 + 10)(0 + 10)(0 + 10)
0 10 0
- 1. 正則表達式到DFA
- 2. 與此正則表達式匹配的是什麼?
- 3. 正則表達式的正則表達式是什麼?
- 4. 正則表達式:與DFA搜索(而不是匹配)
- 5. 提取此URL的正則表達式模式是什麼?
- 6. 轉換正則表達式到DFA
- 7. 爲什麼我的正則表達式與此不符?
- 8. 什麼是好的正則表達式?
- 9. 什麼是「Test123」的正則表達式
- 10. 與此正則表達式相當的形式語法是什麼?
- 11. 基於DFA的正則表達式引擎的Java與捕獲
- 12. 正則表達式模式的正則表達式模式是什麼?
- 13. 對此正則表達式的解釋
- 14. 「[^]」正則表達式模式的含義是什麼(javascript正則表達式)?
- 15. 這是什麼正則表達式?
- 16. 什麼是正則表達式?
- 17. Lex這是什麼正則表達式
- 18. 什麼是(\\&| $)正則表達式匹配
- 19. 這是什麼正則表達式?
- 20. 什麼是前綴正則表達式?
- 21. 什麼是正則表達式或?
- 22. 正則表達式:什麼是InCombiningDiacriticalMarks?
- 23. 這是什麼正則表達式?
- 24. 什麼是正則表達式接受
- 25. 這將是什麼正則表達式?
- 26. ,這是什麼陣正則表達式
- 27. 這是什麼javascript正則表達式?
- 28. 是什麼`\\ s`正則表達式中
- 29. 是什麼,這些正則表達式
- 30. 正則表達式是什麼
等待什麼是標籤基於B自我循環,E –