2015-09-18 17 views
3

我最近開始學習常規表達式,並試圖爲上面的問題寫一個。如果限制僅限於一個字母(例如不超過2「b」),則不會有困難。如何爲所有包含「a」,「b」和「c」但不超過2個「b」和3「c」的字符串編寫簡潔的正則表達式

那麼答案將是:A * C *(B |ε)A * C *(B |ε)A * C *

但隨着2 「B」 秒和3個 「C」, 「a」之間可能的排序總數爲24(5選3),所以編寫一個正則表達式來包含所有這些可能性將是非常重要的(因爲我們可以選擇任意數量的bs和cs,只要數字分別小於2和3)(例如,bcbcc,cbbcc,bcbc,bcc,b,c,...)。

那麼有可能爲這個問題寫一個簡潔的正則表達式,或者至少可以通過簡化寫出可能性嗎?

回答

-1

我認爲在這種情況下,你想否定你要找的東西,因爲找到兩個以上的b或c很容易。你可以這樣做(?!.*b.*b.*|.*c.*c.*c.*)說,不超過2個B的和3c的

+0

可以包含 'd' 或其他任何東西,儘管 –

+0

你可以用你喜歡的任何字符類替換'.',這只是一個更簡潔的回答,像這樣 –

+0

非常感謝!但有沒有可能做到這一點否定 - 我正在從一本書中解決這個問題,我們還沒有學會''。或否定正則表達式。此外,@CarlosBribiescas對downvote感到遺憾 - 無意中擊中它,現在因爲缺乏積分而不會讓我高興。 – nrajed

1

如何:

^(?=(?:[ac]*b){1,2}[ac]*$)(?=(?:[ab]*c){1,3}[ab]*$) 

說明:

^    : begining of string 
    (?=   : look ahead 
    (?:   : non capture group 
     [ac]*  : letters a or c 0 or more times 
     b   : letter b 
    ){1,2}  : the group must be present once or twice 
    [ac]*  : letters a or c 0 or more times 
    $   : end of string 
) 
    (?=   : look ahead 
    (?:   : non capture group 
     [ab]*  : letters a or b 0 or more times 
     c   : letter c 
    ){1,3}  : the group must be present once or three times 
    [ab]*  : letters a or b 0 or more times 
    $   : end of string 
) 
相關問題