5

私は単語のリストを持っています:

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と完全に一致しないため、削除しないでください。

誰でも私にこれについてアドバイスできますか?

4

7 に答える 7

17
string cleaned = Regex.Replace(input, "\\b" + string.Join("\\b|\\b",BAD_WORDS) + "\\b", "")
于 2012-09-01T09:55:02.230 に答える
6

これは、Linq にとっても、Split メソッドにとっても重要なタスクです。これを試して:

return string.Join(" ", input.Split(' ').Where(w => !BAD_WORDS.Contains(w)));
于 2012-09-01T09:55:54.920 に答える
1

次のような StartWith および EndsWith メソッドを使用できます。

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

これで問題が解決することを願っています。

于 2012-09-01T09:51:56.703 に答える
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();
于 2012-09-01T09:52:04.920 に答える
1

単語をテキストから 1 つのリストに保存できます。次に、すべての単語が悪いリストにあるかどうかを確認します。次のようになります。

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

myWords.RemoveAll(word => badWords.Contains(word));
string Result = string.Join(" ", myWords);
于 2012-09-01T09:55:36.653 に答える
0

次のように、 for 内の whiole だけで実行する必要があることを指摘したかっただけです。

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

if 変数と 'w' 変数は必要ありません。いずれにせよ、Antonio Bakula が最初に思いついたのはこれだと思います。

于 2012-09-01T10:10:38.403 に答える