2016-05-25 25 views
0

所以我最近有一個面試問題,要求我確定一個字符串是否平衡。一個字符串在這兩個條件下得到平衡:計算字符串中的字符匹配數(僅適用於Regex)?

  1. 'a'和'c'的出現總和是偶數。
  2. 'b'和'd'發生的總和是偶數。

因此,給出示例「cccddbba」這些條件成立。 c (3) + a (1)的出現次數爲even (1+3=4)d (2)出現次數+ b (2)出現次數爲even (2+2=4)。字符串只能包含字符'a','b','c'和'd'。正則表達式應該適用於任何字符串,而不僅僅是這個例子。

我的任務只是爲此編寫正則表達式。我假設在背景中,他們計算使用我的正則表達式找到的'a'和'c'的匹配數量並總結出來。 'b'和'd'也是如此。

我在一段時間內沒有碰過正則表達式,所以我做得很糟糕,只得到了^([ac])*?[db]*?([ac])*?$,這顯然是不正確的。每個斷言

+2

如果有人問我在面試中,我會回答「不,正則表達式不是一個好的解決方案」。使用正則表達式將會是1.不可讀的2.對於將來的增強而言是不可或缺的。 – Tunaki

+0

實際上這是一個編碼挑戰,而不是一個實際的面試問題,所以我沒有說:(但我完全同意你的意見。 – dtgee

回答

2

使用單獨看aheads:

^(?=(([^ac]*[ac]){2})*[^ac]*$)(?=(([^bd]*[bd]){2})*[^bd]*$).*$ 

live demo

這項工作基本上是因爲([^ac]*[ac]){2})匹配[ac]對。其餘的都比較簡單。

+0

這似乎不符合問題中的例子。 –

+0

對不起,我意識到我沒有指定允許編輯的字符。 – dtgee

+0

@Andy是的,它的確如此。查看演示鏈接(也許你看到了一個很短的早期版本,很快就被修正了)。 – Bohemian

0

使用正向前查找,您可以檢查是否a和c發生偶數次,並同上b和d:

^(?=[^ac]*([ac][^ac]*[ac][^ac]*)*$)(?=[^bd]*([bd][^bd]*[bd][^bd]*)*$).*$ 

每兩個先行組的檢查,整個字符串包含偶數它們各自的字符數。請注意,每個lookahead都固定在末尾($),強制它掃描直到字符串結束。