Каков наилучший способ разобрать строку для "плохих" слов в 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(), что намного эффективнее. Это особенно верно, если у вас есть большой список ненормативной лексики (не уверен, сколько их!:)