2014-04-18 29 views
3

整除查找一個正則表達式表示由{a,b},其中的a數目的是除盡6和b數串可以被8整除。RE:一的數量是整除6和b的數量是由8

我試圖創建一個DFA,其接受這樣的字符串。我的想法是使用所有餘下的mod 6和mod 8,總共剩餘48個餘數。因此,在DFA每個狀態是一對(r, s)其中r從0變化至6和s從0變化至7開始狀態(以及接受狀態)(0, 0)和由我們可以很容易地通過注意給轉換到狀態,如果我們輸入"a"狀態(r, s)轉變到(r + 1, s)和輸入"b"它轉換到狀態(r, s + 1)

但是實在是太難了與48個狀態的DFA工作,我不知道這是否可以通過手動使用DFA最小化算法最小化。

我真的不知道如何才能得到表示這樣的字符串的正則表達式。

+0

不,這不能最小化,它的正則表達式將是非常漫長和複雜的,即使你試圖找到的正則表達式「B」/2和「A」/2將是非常複雜的[閱讀](HTTP: //stackoverflow.com/questions/17420332/need-regular-expression-for-finite-automata-even-number-of-1s-and-even-number-o/17434694#17434694) –

+0

從最終的正則表達式我有你應該明白,你需要爲6a和8b編寫所有可能的組合 - 是的,你可以寫出比較簡單的「正則表達式」(在正式語言中不是正則表達式)。 –

+1

您建議的DFA已經很小。 –

回答

1

如果你被允許使用向前看符號:

^(?=b*((ab*){6})+$)a*((ba*){8})+$ 

Regular expression visualization

Debuggex Demo

匹配字符串的例子:bbaabbaabbaabb

的想法很簡單:我們知道如何搭配有串可以被6整除的a s - ^((b*ab*){6})+$,我們也知道如何匹配字符串,數字爲b s可被8整除 - ^((a*ba*){8})+$。所以我們只需要一個正則表達式,另一個用於匹配部分。

在情況下,如果你需要匹配只由a S或只是b小號字符串,那麼下面的正則表達式會做:

^(?=b*((ab*){6})*$)a*((ba*){8})*$ 

Regular expression visualization

匹配的字符串的

例子: aaaaaabbbbbbbbbbaabbaabbaabb

Debuggex Demo

+0

錯誤問你能分享任何符合你的表達和條件的詞。不幸的是,我無法匹配所需的單詞。 – Murthy

+0

@多層我添加了演示的鏈接。基本上任何由'a'和'b'組成的字符串,其中'a's的數量可以被6整除,而'b's的數量可以被8整除。 –

+0

@ Ulugbek Umirov我嘗試了在線[regex評價者](http://regexr.com/38npa)嘗試過的「babbabbaabbaab」這個詞。請分享任何有用的詞來表達我的理解。 – Murthy

相關問題