字母表上的字符串{a,b,c,d}其中沒有b
後面緊跟着a
,並且沒有c
立即是d
。下列語言的正則表達式
這就是我想出來的,它在某些情況下失敗了。 你可以讓我知道我做錯了什麼。
a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*
字母表上的字符串{a,b,c,d}其中沒有b
後面緊跟着a
,並且沒有c
立即是d
。下列語言的正則表達式
這就是我想出來的,它在某些情況下失敗了。 你可以讓我知道我做錯了什麼。
a*(a|d)*(b(c|d|b)+)*(c(a|b|c)+)*(d(a|b|c|d)+)*
空字符串,abc,acb怎麼樣? b [^ a]是否要求語言中有兩個字符? – 2012-02-03 06:17:36
它在'dca'上失敗,並且也接受'dce',即使它只支持'[abcd]' – 2012-02-03 06:19:57
@ dabble125,是的,你是對的。我轉而採用負向預測。 – mowwwalker 2012-02-03 06:23:48
很多你的子表達式是這樣的:
(c(a|b|c)+)
這是說「交流是必須遵循的一個{A,B,C}你想說什麼。」 AC不能其次是廣告「,但這實際上並不是規則之一,這個表達式不允許只是一個單詞」c「,它應該被接受。
這個子表達式的另一個問題是它可能會將c
與c
。該表達式匹配「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
之後看到a
,d
就可以了。因此,我們需要一個表達式,表示「在ca
之後,然後允許a
和d
的任意組合。由於這是家庭作業,因此我沒有給出完整的表達式。如果您仍在繼續,您應該能夠弄明白。
我們最那裏的方式,唯一剩下的是要認識到我們不關心a
S和d
S如何來許多在字符串的開頭,我們看到我們的第一個b
前或c
。但最終的正則表達式的格式爲「a
s」和「d
」。然後我們有一個重複部分「如果我看到b
或c
我需要擔心接下來會發生什麼......
我相信這會給你。如果你不允許?
運營商,只是與*
替換它
這允許a
或d
接着什麼;其次b
通過b,c,d
或終止的字符串,然後b,c,d
或終止字符串c
(a|d|(b+(c|d))|(c+(b|d)))*(b|c)*
擁有比密切配對更開放的配對。 – stew 2012-02-03 06:25:17
過分依賴智能編輯。固定。 – unpythonic 2012-02-03 06:30:42
這是否接受bba? – 2012-02-03 07:22:07
這是使用負前瞻很簡單:
^(?!.*(ba|cd))[a-d]*
說明:
(ba|cd)
意味着要麼ba
或cd
^(?!.*(ba|cd))
意味着從一開始就放眼望去(不消耗) (^
),應該有不是,在任何地方輸入(.*
),無論是ba
或cd
[a-d]*
意味着任何數量的只有一個,B,C或d這對我有用:'(?!(ba | cd))[abcd]'非常優雅。 – 2012-02-03 06:29:57
或更短:(?!(ba | cd))[ad] – 2012-02-03 06:30:29
這會在無效字符後切斷,而不是負面,只是一個特性 – 2012-02-03 06:33:20
(a|b(?!a)|c(?!d)|d)+
這個工程....但我會怎麼做這...沒有?或者 !
似乎失效,這永遠這樣,我做到這一點... IM王建宇,山西高等學校懷疑它甚至正則表達式
這聽起來像一個計算機科學的問題,使之更適合[cstheory.se。無論如何,'nsregularexpression'標籤適用於Objective-C中該名稱的類,因此我將其刪除。 – 2012-02-03 05:20:40