2012-03-07 83 views
6

我需要用C#替換一部分字符串。 我只能找到一個類似的問題,關於如何實現這個here,但它是PHP。如何將兩個或多個字符串替換爲對方?

我的情況涉及到詞典[字符串,字符串]持有成對更換,如:

  • 狗,貓
  • 貓,小鼠,
  • 鼠標,猛禽

而且我有一個字符串,其值爲:

"My dog ate a cat which once ate a mouse got eaten by a raptor" 

我需要一個函數來得到這樣的:

"My cat ate a mouse which once ate a raptor got eaten by a raptor" 

如果我列舉的詞典和順序調用與string.replace,我得到這個:

"My raptor ate a raptor which once ate a raptor got eaten by a raptor" 

這很奇怪,如果這還沒有被問過,(這是常識嗎?),但我找不到任何東西。所以我很抱歉,如果有,我錯過了。

+0

這樣做的一個骯髒的方法是使用一些中間文本。因此,將'狗'轉換爲'1','貓'轉換爲'2',然後進行第二次轉換,將'1'和'2'轉換爲您想要的值。確保使用比'1'和'2'更獨特的東西(也許是一個GUID)。就像我說的那樣,它很髒,我相信還有更好的方法。 – xbonez 2012-03-07 11:02:06

+0

字典{「foo」:「1」,「bar」:「2」,「foobar」:「3」}和輸入「foo bar foobarbar」是什麼? – Dogbert 2012-03-07 13:26:56

+0

@Dogbert「1 2 32」 – 2012-03-07 13:30:12

回答

9

所以你需要的是匹配進程只發生一次。有一次,我認爲正確的答案實際上是「使用正則表達式」!下面是一些代碼:

var replacements = new Dictionary<string, string> 
         { 
          { "do|g", "cat" }, 
          { "ca^t", "mouse" }, 
          { "mo$$use", "raptor" } 
         }; 

var source = "My do|g ate a ca^t which once ate a mo$$use"; 

var regexPattern = 
    "(" + 
    string.Join("|", replacements.Keys.Select(Regex.Escape)) + 
    ")"; 

var regex = new Regex(regexPattern); 

var result = regex.Replace(source, match => replacements[match.Value]); 

// Now result == "My cat ate a mouse which once ate a raptor" 

我們在這裏建立的模式看起來像(dog|cat|mouse)。在這個交替構造(|)中的每個片段都通過Regex.Escape,使得鍵中的正則表達式字符(例如|,^等)不會導致問題。當找到匹配項時,匹配文本將被字典中的相應值替換。字符串只被掃描一次,所以沒有重複的匹配,因爲迭代的string.Replace的問題。

+0

比我的解決方案更好,更優雅。從我+1。 – 2012-03-07 11:32:55

+1

感謝您的回答。它確實很優雅,但是因爲我沒有使用正則表達式的經驗;我必須問:如果我試圖用狗取代狗,該怎麼辦?是否有辦法中和我想替換的部分(如反斜槓和「|」字符),並避免構建類似'(dog | ca | t | mouse)'的東西? – 2012-03-07 13:19:35

+0

@ d4wn優秀的考慮。根據需要使用'Regex.Escape'進行編輯。 – AakashM 2012-03-07 13:28:17

1

你想要的是讓所有的字符串替換同時執行,這樣你就不會在同一個標​​記上得到幾個替換,對嗎?

我能想到的兩種方法,既不是特別優雅:

  • 遍歷您在特定的順序字典,所以你永遠貓/鼠標前更換鼠標/猛禽。
  • 用'鼠標'代替貓,用'$ mouse $'或類似的標記代替它。這將確保'$ mouse $'不會被替換爲'raptor'(或者實際上'$ raptor $')。然後,一旦你完成了你的開關,你可以刪除所有'$'標誌。
+0

對於第一點,您需要按照與問題相反的順序進行替換,鼠標 - >猛禽然後是貓 - >鼠標,然後是狗 - >貓。 – TheLukeMcCarthy 2012-03-07 11:28:30

+0

在這個特定的示例中,是的。對於更通用的解決方案,您需要構建某種有向無環圖來確保。 – 2012-03-07 11:32:10

+0

這是正確的我只是想給一個具體的例子,所以d4wn可以明白爲什麼它不工作。 – TheLukeMcCarthy 2012-03-07 11:46:14