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

问题描述 投票:2回答:7

我有一个单词列表:

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不完全匹配。

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

c# string replace
7个回答
14
投票
string cleaned = Regex.Replace(input, "\\b" + string.Join("\\b|\\b",BAD_WORDS) + "\\b", "")

5
投票

这对Linq来说是一个很好的任务,也是Split方法。试试这个:

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

1
投票

您可以使用StartsWith和EndsWith方法,如:

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

希望这能解决你的问题。


1
投票

把假空间放在字符串变量qazxsw poi之前和之后。这样它会检测到第一个和最后一个单词。

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, " ");
            }
        }
    }

1
投票

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

input = input.Trim();

0
投票

只是想指出你应该完成整个内部的工作,如下所示:

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

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

没有必要,如果和'w'变量,无论如何我都会使用我上面的答案,安东尼奥巴库拉,首先想到的是这个想到的。


0
投票

根据以下帖子,最快的方法是使用Regex和MatchEvaluator: foreach (var word in BAD_WORDS) { while (input.Contains(String.Format(" {0} ", word);)) { input = input.Replace(w, " "); } }

Replacing multiple characters in a string, the fastest way?
© www.soinside.com 2019 - 2024. All rights reserved.