从单词列表中替换字符串中的多个单词

我有一个单词列表:

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”不应该删除,因为它与BAD WORDS不完全匹配。

有人可以就此提出建议吗?

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

这对Linq来说是一项伟大的任务,也是Split方法。 试试这个:

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

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

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

希望这能解决你的问题。

在字符串可变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(); 

您可以将文本中的单词存储到一个列表中。 然后检查所有单词是否在坏名单中,如下所示:

 List myWords = input.Split(' ').ToList(); List badWords = GetBadWords(); myWords.RemoveAll(word => badWords.Contains(word)); string Result = string.Join(" ", myWords); 

只是想指出你是否已经完成了你内心的任何事情:

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

没有必要,如果和’w’变量,在任何情况下我都会使用我上面的答案,安东尼奥巴库拉,首先想到的是这一点。

根据以下post,最快的方法是使用Regex和MatchEvaluator: 用字符串替换多个字符,最快的方法是什么?

  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);