2012-09-01 219 views
2

我有一個單詞列表:從單詞列表中的字符串替換多個單詞

string[] BAD_WORDS = { "xxx", "o2o" } // My list is actually a lot bigger about 100 words

和我有一些文本(通常較短,最多250個字),我需要刪除所有其中BAD_WORDS

我已經試過這樣:

foreach (var word in BAD_WORDS) 
    { 
     string w = string.Format(" {0} ", word); 
     if (input.Contains(w)) 
     { 
      while (input.Contains(w)) 
      { 
       input = input.Replace(w, " "); 
      } 
     } 
    } 

但是,如果文本開頭或以一個壞詞結尾,​​也不會被刪除。 我做了空格,所以它不會匹配部分單詞,例如「oxxx」不應該被刪除,因爲它不是一個精確匹配的不良詞。

任何人都可以給我這方面的建議嗎?

+1

看起來像正則表達式的工作。 – Oded

+0

你爲什麼包含這行'string w = string.Format(「{0}」,word);'? –

+0

你的任務是什麼,你的代碼看起來不錯?只要刪除如果並做一個startswith和結束。 – Peter

回答

13
string cleaned = Regex.Replace(input, "\\b" + string.Join("\\b|\\b",BAD_WORDS) + "\\b", "") 
+0

稍等片刻,我錯過了一些......工作......在那裏,修好了。 :) – shannon

+0

嘿... :)謝謝Dementic。像我說的那樣做,而不是像我一樣。我只是想說,所有的嵌套和LINQing和循環都有一個簡單的老式/可靠方法。 – shannon

+0

+1用於在開始或其他邊界條件下捕捉單詞。作爲獎勵,如果替換需要多次完成,則可以緩存重複使用的正則表達式。儘管'BAD_WORDS'包含了對regex語法有意義的東西,我會使用'Regex.Escape'。 –

1

你可以使用StartWith和的endsWith方法,如:

while (input.Contains(w) || input.StartsWith(w) || input.EndsWith(w) || input.IndexOf(w) > 0) 
{ 
    input = input.Replace(w, " "); 
} 

希望這將解決您的問題。

+0

你的意思是不是和?通過測試,它必須同時開始,結束幷包含該單詞。 – Tudor

+0

使用||而不是&& –

+0

謝謝@Tudor,我已經更新了我的答案。 –

1

將虛假空間的前後字符串變爲input。這樣它會檢測到第一個和最後一個單詞。

input = " " + input + " "; 

foreach (var word in BAD_WORDS) 
    { 
     string w = string.Format(" {0} ", word); 
     if (input.Contains(w)) 
     { 
      while (input.Contains(w)) 
      { 
       input = input.Replace(w, " "); 
      } 
     } 
    } 

然後修剪字符串:

input = input.Trim(); 
+0

這是一個好主意,這將修復我的代碼,但是還沒有更好的解決方案嗎?代碼似乎有點奇怪,我寫了它,因爲我沒有其他的想法。 – Dementic

1

您可以從文本字存儲到一個列表。然後只是檢查所有的單詞,如果他們在壞名單,如下所示:

List<string> myWords = input.Split(' ').ToList(); 
List<string> badWords = GetBadWords(); 

myWords.RemoveAll(word => badWords.Contains(word)); 
string Result = string.Join(" ", myWords); 
5

這是一個偉大的任務Linq,也是拆分方法。試試這個:

return string.Join(" ", 
        input.Split(' ').Select(w => BAD_WORDS.Contains(w) ? "" : w)); 
+0

太棒了,我愛linq! – Dementic

+0

只要空間足夠。如果後面跟着標點符號,如果後面跟着標點符號,這不會在開頭或結尾處收到單詞。如果需要處理這種情況,基於正則表達式的答案將會做得更好。 –

0

只是想指出的是您shoulde有做只是whiole你裏面像這樣:

foreach (var word in BAD_WORDS) 
{ 
    while (input.Contains(String.Format(" {0} ", word);)) 
    { 
     input = input.Replace(w, " "); 
    } 
} 

沒有必要的,如果和「W」變量,在任何情況下我很害怕使用Antonio Bakula的回答,首先想到的就是這個。

+0

您正在嘗試替換已從代碼中移除的'w'。沒有'w'的 ,它也會替換部分單詞匹配。 – Dementic

0

根據以下後以最快的方式是使用正則表達式和MatchEvaluator: Replacing multiple characters in a string, the fastest way?

 Regex reg = new Regex(@"(o2o|xxx)"); 
     MatchEvaluator eval = match => 
     { 
      switch (match.Value) 
      { 
       case "o2o": return " "; 
       case "xxx": return " "; 
       default: throw new Exception("Unexpected match!"); 
      } 
     }; 
     input = reg.Replace(input, eval); 
相關問題