2012-05-14 23 views
1

下面是變換我想在正則表達式做一個表:如何替換Regex中最後重複的字母?

From  To 
================ 
CAT  CAT 
EGG  EGG 
A   A 
Z   Z 
AA   ZA 
BB   ZB 
ZZ   ZZ 
AAA  ZZA 
HHHHH  ZZZZH 

換句話說,這裏的字符串是相同的字母重複2次以上,我想替換所有字母除了最後一個與Z.

我在這裏被精神阻塞。這是我想出,到目前爲止,這是行不通的:

FIND:  ^(?<=\1*?)([A-Z])(?=\1+)$ 
REPLACE: Z 

我不確定是否反向引用甚至可以捕捉組之前使用,但無論哪種方式,取代了第一\1.沒有幫助。

我正在使用C#,所以我正在尋找.NET風格的正則表達式。我當然可以用普通的字符串操作來做到這一點,但我有一個商業案例特定的需要使用正則表達式。

+0

爲什麼EGG不應與EZG被取代? – m0skit0

+0

因爲重複的字符不是*完全相同的字符*應該保持不變。 – richardtallent

+2

順便說一句,我不認爲正則表達式可以應用於這種情況,因爲你的語言不規則,在這種情況下沒有上下文,因爲正則表達式必須知道哪個字符應該重複,並且這不是上下文無關的(我認爲...)。 – m0skit0

回答

3

難道有人爲了一些dark magic

FIND: \G([A-Z])(?=\1) 
REPLACE: Z 

\G錨每場比賽要麼像\A呢,還是在以前的比賽結束位置的字符串的開頭。換句話說,在你的正則表達式中的([A-Z])總是試圖匹配下一個字符,並且感謝前瞻 - (?=\1) - 你知道下一個字符與你剛剛替換的字符相同。

而且,在你的自我的答案正則表達式不會爲我工作。 +沒有做任何有用的事情(畢竟你只關心下一個角色),但它也不會傷害任何東西。什麼讓它爲我工作是刪除$

更新:我沒有捕捉字符串必須是兩個或更多相同的字符,沒有別的的要求。這意味着+$都是必需的。雖然我在,我會解決增加的要求,字符串XX,XXX,IIIII應該單獨留下。瞧!

\G(?!\A(?:XXX?|III?)$)([A-Z])(?=\1+$) 
+0

太棒了!我必須做一個小改動:'\ G([A-Z])(?= \ 1 + $)'。如果在前視圖中沒有'+ $',它會將'HHHHG'轉換爲'ZZZHG',而不是單獨放置(如「EGG」)。這就是我在原始答案中使用'+'和'$'的地方。顯然我需要刷上錨點,除了'^'和'$'之外,我並不經常使用它們。 我沒有提到的一個警告 - XX,II,XXX和III必須從我的實際應用程序中的此替換中排除。所以最後,我可能不得不堅持我的非RegEx替換代碼。 – richardtallent

+0

不要放棄!檢查我的編輯。 –

+0

+1尼斯,使用\ G錨點,強制最後一個停止的比賽。這比後面的看起來要快。添加(?= \ 1 + $)確實完成了循環。 – sln

2

這是可能的,只是第一個符合您需要的字符,然後做先行和回顧後,包括在那些並沒有在主表達了錨,因爲你想表達的字符匹配的字符。

([A-Z])(?<=^\1*)(?=\1+$) 

雖然它不會非常高效,因爲它會爲每個字符遍歷整個字符串。

你最好使用正則表達式來檢測字符串是否由相同的字符組成,然後用普通的字符串替換方法替換除Z最後的所有字符,或者創建一個Zs字符串例如,原始的一個減1,然後附加原始的第一個字符。

+0

+1這可能是通過替換實現的神奇正則表達式。我一直在忘記背後有多大的變化長度。 – sln

+0

在這種情況下,它沒有做出匹配的區別,但是對可選的'\ 1 *'進行了一些看似誤導的處理。 '([A-Z])(?<=^\ 1 +)(?= \ 1 + $)'可能會導致性能差異,不確定。 – sln

+0

我和Alan的表現稍微簡單一些,但+1表達了工作答案,並正確地提到了性能方面。 – richardtallent

0

大概就像一場比賽,然後替換可能會起作用。

string [] Samps = { "CAT", "EGG", "A", "Z", "AA", "BB", "ZZ", "AAA", "HHHHH" }; 
foreach (var item in Samps) 
{ 
    string line = item + "\t\t"; 
    line += Regex.Match(item, @"^([A-Z])\1+$").Success ? 
      Regex.Replace(item, @".(?!$)", "Z") : 
      item; 
    Console.WriteLine(line); 
} 

輸出

CAT    CAT 
EGG    EGG 
A    A 
Z    Z 
AA    ZA 
BB    ZB 
ZZ    ZZ 
AAA    ZZA 
HHHHH   ZZZZH 
相關問題