2012-09-01 190 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); 
相关问题