使用Regex替换坏词

时间:2010-07-27 08:52:01

标签: c# .net regex

我正在尝试创建一个错误的单词过滤器方法,我可以在每次插入和更新之前调用它来检查字符串是否有任何坏词并替换为“[Censored]”。

我有一个带有坏词列表的SQL表,我想把它们带回来并将它们添加到List或字符串数​​组中并检查传入的文本字符串以及是否找到任何坏词替换它们并返回过滤后的字符串。

我正在使用C#。

4 个答案:

答案 0 :(得分:18)

在进行字符串替换之前,请先查看此“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);

给出输出:

  

我[截尾] [截尾]时间没有[截尾]睡眠 - 隔壁邻居正在全速演奏古典音乐!

请注意,“经典”不会变成“cl [Censored] ical”,因为整个单词与正则表达式匹配。

更新2

为了展示如何轻易破坏这种(以及一般的基本字符串\模式匹配技术)的风格,请参阅以下字符串:

  

“我已经没有为chuffıngchuffıngs天睡觉了 - 隔壁邻居正在全速演奏古典音乐!”

我用“土耳其小写”取代了“我”,取消了“ı”。仍然看起来非常冒犯!

答案 1 :(得分:4)

虽然我是Regex的忠实粉丝,但我认为这对你没有帮助。您应该将您的坏词提取到字符串列表或字符串数​​组中,并在传入的消息上使用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是你的结果。

答案 2 :(得分:2)

您可以使用string.replace()方法或RegEx类

答案 3 :(得分:1)

还有一篇关于它的好文章,可以找到here

通过一些html解析技巧,你可以获得一个包含来自noswear

的咒骂词的大型列表