Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换单词列表中字符串中的多个单词_C#_String_Replace - Fatal编程技术网

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

C# 替换单词列表中字符串中的多个单词,c#,string,replace,C#,String,Replace,我有一个单词列表: string[]BAD_WORDS={“xxx”,“o2o”}//我的列表实际上要大得多,大约有100个单词 我有一些文本(通常很短,最多250个单词),我需要删除其中所有的坏单词 我试过这个: foreach (var word in BAD_WORDS) { string w = string.Format(" {0} ", word); if (input.Contains(w)) {

我有一个单词列表:

string[]BAD_WORDS={“xxx”,“o2o”}//我的列表实际上要大得多,大约有100个单词

我有一些文本(通常很短,最多250个单词),我需要删除其中所有的
坏单词

我试过这个:

    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”不应该被删除,因为它与坏单词不完全匹配


有人可以给我一些建议吗?

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

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

希望这能解决您的问题。

在字符串变量
输入前后放置假空格。这样它就能检测出第一个和最后一个单词

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<string> myWords = input.Split(' ').ToList();
List<string> badWords = GetBadWords();

myWords.RemoveAll(word => badWords.Contains(word));
string Result = string.Join(" ", myWords);
List myWords=input.Split(“”).ToList();
列出坏单词=GetBadWords();
myWords.RemoveAll(word=>badWords.Contains(word));
字符串结果=string.Join(“,myWords);

这是Linq的一项伟大任务,也是拆分方法。试试这个:

return string.Join(" ", input.Split(' ').Where(w => !BAD_WORDS.Contains(w)));

我只是想指出,你应该在你的大脑里做一些类似的事情:

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

不需要那个if和w变量,无论如何我都会用上面的答案,安东尼奥·巴库拉,首先想到的是这个

根据以下帖子,最快的方法是使用Regex和MatchEvaluator:


看起来像正则表达式的作业。为什么要包括这一行
string w=string.Format(“{0}”,word)?你的任务是什么,你的代码看起来很好?只需删除if,然后执行startswith和end with.@Nikhil Agrawal:在前后放置空格。例如,如果您只保留单词,它也将匹配oxxx。您的
If
是不必要的。最好从
开始,而
避免第一次检查两次。你的意思是不是和?在测试中,它必须同时开始、结束和包含单词。这仍然会捕获部分单词(badword='aoooo',实际单词='aoooome',它将删除'aoooo'。这是一个好主意,这将修复我的代码,但没有更好的解决方案吗?代码似乎有点奇怪,对我来说,我写它是因为我没有其他想法。稍等,我错过了一些东西…工作…那里,修复了。:)嘿…:)谢谢Dementic。照我说的做,不要照我做的做。我只是想说,所有的嵌套、临清和循环都有一个简单的、古老的、经过验证的、真实的方法。+1用于在开始时捕捉单词或其他边界条件。另外,如果需要多次替换,则可以缓存生成的正则表达式以供重复使用。我会使用
Regex.Escape
,尽管以防万一
BAD_WORDS
包含了一些对Regex语法有意义的东西。可能不是像其他人指出的那样完美的代码,但是+1用于使用Regex单词边界而不是拆分。只要空格足够。如果后面跟一个换行符,如果后面跟标点符号等,这就不会抓住开头或结尾的单词。如果需要处理这种情况,基于正则表达式的答案会做得更好。这是在单词之间添加额外的空格,我不知道为什么空字符串会在其他项目的两侧加上空格。我已经编辑了答案(现在更整洁了!)您正在尝试替换从代码中删除的
w
。如果没有
w
,它也将替换部分单词匹配。
   foreach (var word in BAD_WORDS)
{
    while (input.Contains(String.Format(" {0} ", word);))
    {
        input = input.Replace(w, " ");
    }
}
        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);