有沒有辦法找出兩個任意正則表達式是否相等?對我來說看起來很複雜,但是可能有一些DFA簡化機制或者其他什麼?正則表達式相等
Q
正則表達式相等
15
A
回答
10
要測試等價你可以計算minimal DFAs的表情和對它們進行比較。
1
這兩個Perlmonks線程討論這個問題(特別是讀blokhead的反應):
10
等式的可測性是正則表達式的經典屬性之一。 (注:這如果你真的在談論Perl的正則表達式或一些其他技術上非正規 superlanguage不成立。)
把你的資源來推廣有限自動機A和B,然後建立一個新的自動機AB這樣A的接受狀態具有空轉變到B的開始狀態,並且B的接受狀態被反轉。這給你一個自動機,接受A接受的所有字符串,除了所有被B接受的字符串外。
對B-A做同樣的事情,並且同時減少到純粹的FA。如果FA沒有從起始狀態可訪問的接受狀態,則接受空語言。如果你能證明這兩個AB和BA都是空的,你已經表明,A = B.
Edit
嘿,我不能相信沒有人注意到巨大的錯誤 - 故意之一,當然: - p
如上所述的自動機AB將接受那些其前半部分被A接受並且後半部分不被B接受的字符串。構建期望的 AB是稍微複雜的過程。我不能把它想成我的頭頂,但我確實知道它是明確的(並且可能涉及創建狀態來表示接受A的狀態和B中的非接受狀態的產物)。
2
這真的取決於你的意思是正則表達式。正如其他海報所指出的那樣,將這兩種表達方式都縮減爲最小DFA應該可行,但它僅適用於純正則表達式。
真實世界中使用的一些結構正則表達式庫(特別是反向引用)使它們有能力表達不規則的語言,所以DFA算法不適用於它們。例如,正則表達式:([a-z]*) \1
匹配由空格(a a
和b b
但不是b a
或a b
)分隔的相同單詞的雙重出現。這完全不能被有限自動機識別。
相關問題
- 1. 正則表達式 - 它們是相同的正則表達式?
- 2. 正則表達式(正則表達式)
- 3. 正則表達式(正則表達式)
- 4. 正則表達式(正則表達式)
- 5. 正則表達式正則表達式正則表達式使用正則表達式,但不是與Python
- 6. double的正則表達式等於
- 7. 等效正則表達式標記
- 8. 正則表達式課程等級
- 9. 正則表達式 - 值不等於0,00
- 10. 正則表達式 - 值不等於
- 11. 的Javascript正則表達式等效{L}
- 12. 不同正則表達式的等價
- 13. 平等的POSIX正則表達式C++
- 14. java等價於python正則表達式
- 15. 等效「而不是」正則表達式
- 16. 正則表達式刪除等
- 17. PHP等於正則表達式
- 18. 正則表達式等代碼
- 19. Javascript中的等效正則表達式
- 20. 等號的正則表達式問題?
- 21. 正則表達式匹配等級
- 22. 正則表達式正則表達式返回的值正則表達式
- 23. 正則表達式正則表達式模仿正則表達式
- 24. PHP-MySQLi替換爲正則表達式/正則表達式/正則表達式
- 25. 正則表達式的相等數量爲0和1
- 26. 正則表達式匹配兩個不相等的數字
- 27. 庫檢查兩個正則表達式是否相等/同構
- 28. 在PowerShell中,正則表達式的\ K有多相等?
- 29. 正則表達式,以避免相等和序列數字
- 30. 正則表達式表達
通過比較兩個DFA,你是什麼意思?圖同構? – damned 2014-01-02 04:40:06
由於你有一個初始狀態,並且轉換被標記並且是確定性的,所以很容易檢查DFA是否相等,比圖同構要容易得多。一次深度優先遍歷就足夠了。 – starblue 2014-01-03 13:35:08