我有一个单词列表:
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不完全匹配。
任何人都可以就此提出建议吗?
答案 0 :(得分:14)
string cleaned = Regex.Replace(input, "\\b" + string.Join("\\b|\\b",BAD_WORDS) + "\\b", "")
答案 1 :(得分:5)
这对Linq来说是一个很棒的任务,也是Split方法。试试这个:
return string.Join(" ",
input.Split(' ').Select(w => BAD_WORDS.Contains(w) ? "" : w));
答案 2 :(得分:1)
您可以使用StartWith和EndsWith方法,如:
while (input.Contains(w) || input.StartsWith(w) || input.EndsWith(w) || input.IndexOf(w) > 0)
{
input = input.Replace(w, " ");
}
希望这能解决您的问题。
答案 3 :(得分: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();
答案 4 :(得分:1)
您可以将文字中的文字存储到一个列表中。然后检查所有单词是否在坏名单中,如下所示:
List<string> myWords = input.Split(' ').ToList();
List<string> badWords = GetBadWords();
myWords.RemoveAll(word => badWords.Contains(word));
string Result = string.Join(" ", myWords);
答案 5 :(得分:0)
只是想指出你是否已经完成了你内心的任何事情:
foreach (var word in BAD_WORDS)
{
while (input.Contains(String.Format(" {0} ", word);))
{
input = input.Replace(w, " ");
}
}
如果和'w'变量,无论如何我都不需要使用我上面的答案,安东尼奥巴库拉首先想到的是这个。
答案 6 :(得分:0)
根据以下帖子,最快的方法是使用Regex和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);