Каков наилучший способ разобрать строку для "плохих" слов в C#?

Я думаю о чем-то вроде:

foreach (var word in paragraph.split(' ')) {
  if (badWordArray.Contains(word) {
    // do something about it
  }
}

но я уверен, что есть лучший способ.

Заранее спасибо!

ОБНОВЛЕНИЕ Я не собираюсь удалять матом автоматически... для моего веб-приложения, я хочу получать уведомления, если используется слово, которое я считаю "плохим". Тогда я сам проверю, чтобы убедиться, что это законно. Система автоматической маркировки.

3 ответа

Решение

Хотя ваш путь работает, это может занять немного времени. Здесь есть замечательный ответ на предыдущий вопрос SO. Хотя вопрос говорит о PHP вместо C#, я думаю, что он может быть легко перенесен.

Изменить, чтобы добавить пример кода:

public string FilterWords(string inputWords) {
    Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
    return wordFilter.Replace(inputWords, "<3");
}

Это должно работать для вас, более или менее.

Изменить, чтобы ответить на разъяснение ОП:

Я не собираюсь автоматически удалять нецензурные выражения... для моего веб-приложения я хочу получать уведомления, если используется слово, которое я считаю "плохим".

Как и в приведенной выше части замены, вы можете увидеть, соответствует ли что-то вроде этого:

public bool HasBadWords(string inputWords) {
    Regex wordFilter = new Regex("(puppies|kittens|dolphins|crabs)");
    return wordFilter.IsMatch(inputWords);
}

Он вернется true если строка, которую вы передали ей, содержит какие-либо слова в списке.

На моей работе мы внедрили некоторую автоматическую фильтрацию плохих слов в наше программное обеспечение (это шокирует, когда вы просматриваете исходный код и неожиданно наталкиваетесь на массив, содержащий несколько страниц непристойности).

Один совет - предварительно обработать пользовательский ввод перед проверкой вашего списка, в этом случае кто-то пытается что-то украсть у вас. Таким образом, с помощью предварительной обработки мы

  • прописными буквами все на входе
  • удалить большинство не буквенно-цифровых символов (то есть просто разделить пробелы или знаки пунктуации и т. д.)
  • и затем, предполагая, что кто-то пытается выдать цифры за буквы, сделайте что-то вроде этого: замените ноль на O, 9 на G, 5 на S и т. д. (проявите изобретательность)

А потом найдите друзей, чтобы попытаться сломать это. Это весело.

Вы могли бы рассмотреть возможность использования HashKey объекты или Dictionary<T1, T2> вместо массива использование словаря, например, может сделать код более эффективным, потому что метод.Contains() становится.Keys.Contains(), что намного эффективнее. Это особенно верно, если у вас есть большой список ненормативной лексики (не уверен, сколько их!:)

Другие вопросы по тегам