从字符串中删除字符串列表 - C#.NET

时间:2013-12-10 12:36:56

标签: c# .net string replace

我有一个需要从字符串中删除的停用词列表。

List<string> stopwordsList = stopwords.getStopWordList();
string text = PDF.getText();
foreach (string stopword in stopwordsList)
{
   text = text.Replace(stopword, "");
}
PDF.setText(text);

..在调试中我可以看到正确填充了stopwordsList,但似乎text.Replace()没有任何效果。

我做错了什么?

编辑:注意我自己也尝试了text.Replace(),而不是text = text.Replace()。都没有工作。

2 个答案:

答案 0 :(得分:2)

虽然我认为您的代码没有任何问题,但我会做这样的事情。

string someText = "this is some text just some dummy text Just text";
List<string> stopwordsList = new List<string>() { "some", "just", "text" };    
someText = string.Join(" ", someText.Split().Where(w => !stopwordsList.Contains(w, StringComparer.InvariantCultureIgnoreCase)));

如果套管很重要,你可以忽略StringComparer.InvariantCultureIgnoreCase部分。

  

注意我自己也尝试过text.Replace(),而不是text = text.Replace()

你应该知道,如果你想要更新的字符串,Replace函数会返回应该处理的字符串。所以你现在基本上就是这样做的。即text = text.Replace()

答案 1 :(得分:2)

虽然有一个问题......所有以前的解决方案都没有考虑到字边界。例如,单词'hell'可能是一个坏词,但'hello'这个词完全有效。此外,更换应仅在完整的单词上进行,否则您可能会得到奇怪的结果。

以下是考虑字边界的代码:

var text = "Hello world, this is a great test!";
var badWords = new List<string>()
{
    "Hello", 
    "great"
};

var wordMatches = Regex.Matches(text, "\\w+")
    .Cast<Match>()
    .OrderByDescending(m => m.Index);

foreach (var m in wordMatches)
    if (badWords.Contains(m.Value))
        text = text.Remove(m.Index, m.Length);

Debug.WriteLine(text);