Ответ 1
Пожалуйста, просмотрите эту статью "clbuttic" (или для вашего случая cl [Censored] ic), прежде чем выполнять замену строки без учета границ слов:
Обновление
Очевидно, что он не является надежным (см. статью выше - этот подход настолько легко обойти или создать ложные срабатывания...) или оптимизирован (регулярные выражения должны быть кэшированы и скомпилированы), но следующее будет отфильтровывать целые слова (нет "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 "ı". Все еще выглядит довольно оскорбительным!