Заменить неправильные слова с помощью Regex

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

У меня есть таблица SQL, у которой есть список плохих слов, я хочу вернуть их и добавить их в список или массив строк и проверить строку текста, которая была передана, и если найдены какие-либо плохие слова замените их и верните отфильтрованную строку обратно.

Я использую для этого С#.

Ответ 1

Пожалуйста, просмотрите эту статью "clbuttic" (или для вашего случая cl [Censored] ic), прежде чем выполнять замену строки без учета границ слов:

http://www.codinghorror.com/blog/2008/10/obscenity-filters-bad-idea-or-incredibly-intercoursing-bad-idea.html

Обновление

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

const string CensoredText = "[Censored]";
const string PatternTemplate = @"\b({0})(s?)\b";
const RegexOptions Options = RegexOptions.IgnoreCase;

string[] badWords = new[] { "cranberrying", "chuffing", "ass" };

IEnumerable<Regex> badWordMatchers = badWords.
    Select(x => new Regex(string.Format(PatternTemplate, x), Options));

string input = "I've had no cranberrying sleep for chuffing chuffings days -
    the next door neighbour is playing classical music at full tilt!";

string output = badWordMatchers.
   Aggregate(input, (current, matcher) => matcher.Replace(current, CensoredText));

Console.WriteLine(output);

Выдает вывод:

У меня не было [Censored] сна для [Censored] [Censored] дней - сосед по соседству играет классическую музыку при полном наклоне!

Обратите внимание, что "классический" не становится "cl [цензурированным]", поскольку целые слова сопоставляются с регулярным выражением.

Обновление 2

И чтобы продемонстрировать, как эта (и в целом базовая строка\методы сопоставления шаблонов) может быть легко подорвана, см. следующую строку:

"У меня не было сна cranberryıng для chuffıng chuffıngs days - сосед по соседству играет классическую музыку при полном наклоне!"

Я заменил "i" на турецкий нижний регистр unottted "ı". Все еще выглядит довольно оскорбительным!

Ответ 2

Хотя я большой поклонник Regex, я думаю, это вам не поможет. Вы должны забрать свое плохое слово в строку List или string Array и использовать System.String.Replace в своем входящем сообщении.

Возможно, лучше, используйте методы System.String.Split и .Join:

string mayContainBadWords = "... bla bla ...";
string[] badWords = new string[]{"bad", "worse", "worst"};

string[] temp = string.Split(badWords, StringSplitOptions.RemoveEmptyEntries);
string cleanString = string.Join("[Censored]", temp);

В образце mayContainBadWords - строка, которую вы хотите проверить; badWords - это строковый массив, который вы загружаете из таблицы sql вашего плохого слова, а cleanString - ваш результат.

Ответ 3

вы можете использовать метод string.replace() или класс RegEx

Ответ 4

Существует также хорошая статья об этом, которая может найти здесь

С помощью небольшого html-синтаксического анализа вы можете получить большой список с ругательными словами из noswear