2012-02-03 139 views
3

字母表上的字符串{a,b,c,d}其中沒有b後面緊跟着a,並且沒有c立即是d下列語言的正則表達式

這就是我想出來的,它在某些情況下失敗了。 你可以讓我知道我做錯了什麼。

a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)* 
+0

這聽起來像一個計算機科學的問題,使之更適合[cstheory.se。無論如何,'nsregularexpression'標籤適用於Objective-C中該名稱的類,因此我將其刪除。 – 2012-02-03 05:20:40

回答

0

我得到了什麼:

(a|b(?!a)|c(?!d)|d)+ 

測試:

http://gskinner.com/RegExr/

+0

空字符串,abc,acb怎麼樣? b [^ a]是否要求語言中有兩個字符? – 2012-02-03 06:17:36

+0

它在'dca'上失敗,並且也接受'dce',即使它只支持'[abcd]' – 2012-02-03 06:19:57

+0

@ dabble125,是的,你是對的。我轉而採用負向預測。 – mowwwalker 2012-02-03 06:23:48

0

試試這個:

(?<!b)a|(?<!c)d|b(?!a)|c(?!d) 

它確保了沒有a遵循b,並且沒有b在其前面有a。它確保沒有d跟在c之後,並且沒有c在其前面有d

此外,如果您要添加其他任何內容,我會將其包裝在()中。

+0

它無法匹配「c」 – stew 2012-02-03 06:25:55

+0

不,它不會...它匹配前面沒有廣告的任何c – 2012-02-03 06:28:01

+0

對不起,我認爲我的評論和你的編輯交叉路徑:) – stew 2012-02-03 06:32:55

1

很多你的子表達式是這樣的:

(c(a|b|c)+) 

這是說「交流是必須遵循的一個{A,B,C}你想說什麼。」 AC不能其次是廣告「,但這實際上並不是規則之一,這個表達式不允許只是一個單詞」c「,它應該被接受。

這個子表達式的另一個問題是它可能會將cc。該表達式匹配「cc」,該表達式後面的表達式爲(d(a|b|c|d)+)*,其將匹配「dc」,因此條帶g「ccdc」與這兩個表達式相匹配,這給了我們一個d,跟在c之後,這違反了規則。

所以問問自己。真的可以遵循c?如果d跟在c之後,可以嗎?很明顯不是。如果a跟在c之後,可以嗎?是。如果b跟隨着c,可以嗎?是。所以我們很想寫c(b|a)。但是有一個c必須遵循其中之一嗎?沒有。所以我們試試c(b|a)*。但是,從上面我們可以看出,我們可能不希望我們的正則表達式「吃」b,因爲一旦我們有b,我們不必擔心b後面的字母是否爲a。所以我們可以在這裏做的最好的是ca*

遵循相同的邏輯來找出與b盯着東西的表達式。你拿出bd*

這些應該可以重複,所以我們得到(ca*|bd*)*。這是怎麼讀的? 「A c可以跟着a s。一個b可以跟在d s。這仍然沒有讓我們所有的方式。我們要確保t d不會立即跟隨c。但我們允許的所有內容是d後跟b。由於「cad」不被我們的正則表達式接受,所以我們失敗了。一旦我們在c之後看到ad就可以了。因此,我們需要一個表達式,表示「在ca之後,然後允許ad的任意組合。由於這是家庭作業,因此我沒有給出完整的表達式。如果您仍在繼續,您應該能夠弄明白。

我們最那裏的方式,唯一剩下的是要認識到我們不關心a S和d S如何來許多在字符串的開頭,我們看到我們的第一個b前或c。但最終的正則表達式的格式爲「a s」和「d」。然後我們有一個重複部分「如果我看到bc我需要擔心接下來會發生什麼......

1

我相信這會給你。如果你不允許?運營商,只是與*替換它

這允許ad接着什麼;其次b通過b,c,d或終止的字符串,然後b,c,d或終止字符串c

(a|d|(b+(c|d))|(c+(b|d)))*(b|c)* 
+0

擁有比密切配對更開放的配對。 – stew 2012-02-03 06:25:17

+0

過分依賴智能編輯。固定。 – unpythonic 2012-02-03 06:30:42

+0

這是否接受bba? – 2012-02-03 07:22:07

2

這是使用負前瞻很簡單:

^(?!.*(ba|cd))[a-d]* 

說明:

  • (ba|cd)意味着要麼bacd
  • ^(?!.*(ba|cd))意味着從一開始就放眼望去(不消耗) (^),應該有不是,在任何地方輸入(.*),無論是bacd
  • [a-d]*意味着任何數量的只有一個,B,C或d
+0

這對我有用:'(?!(ba | cd))[abcd]'非常優雅。 – 2012-02-03 06:29:57

+0

或更短:(?!(ba | cd))[ad] – 2012-02-03 06:30:29

+0

這會在無效字符後切斷,而不是負面,只是一個特性 – 2012-02-03 06:33:20

0
(a|b(?!a)|c(?!d)|d)+ 

這個工程....但我會怎麼做這...沒有?或者 !

似乎失效,這永遠這樣,我做到這一點... IM王建宇,山西高等學校懷疑它甚至正則表達式