使用正则表达式的亵渎过滤器(100个单词的列表)

时间:2011-11-29 23:17:59

标签: regex language-agnostic profanity

从字符串中删除亵渎字的正确方法是什么:
1)我在一个字符串数组中有一个要查找的100个单词的列表。 2)处理部分单词的正确方法是什么?大多数人如何处理这个问题?例如,质量这个词。然后有时候一个部分词也是坏的 - 假设foobar是一个非常亵渎的词我可能想要禁止foobar和foobar *和* foobar。

那么您是否将所有单词放入单个表达式或循环列表中?

解决问题的正确方法是什么?我正在使用Groovy / Grails,但欢迎任何现代语言示例。

3 个答案:

答案 0 :(得分:3)

  1. 将每个单词连接成单词列表 - (foobar|foobaz|...)
  2. 然后将警卫放在分组的两侧以获取无关的字符

    [^!@#$%^&*]*(foobar|foobaz|foofii)[^!@#$%^&*]*

  3. 另外,你可能想要使用不区分大小写的标志,这样它也会匹配像FooBaz和fOObaR这样的单词。

    就性能而言,连接这个作为一个大的正则表达式可能是最快的(虽然我不是专家)。正则表达式算法在搜索和搜索方面非常有效。处理分支条件。基本上,它必须优于O(mn)(其中m是单词的数量,而n是您正在搜索的文本的大小)

答案 1 :(得分:3)

这是一个非常难以解决的问题,您需要确定正则表达式是否适合您以及如何处理嵌入(当您将字典单词添加到像Frackface这样的亵渎语言时除了真正的F-word之外)。

正则表达式通常会限制它们的长度,这通常会阻止您对所有单词使用单个正则表达式。对字符串执行多个正则表达式非常慢,具体取决于您需要的性能以及黑名单的大小。我们最初将CleanSpeak实现为正则表达式系统,但它没有扩展,我们使用不同的机制重写它。

您还需要考虑短语,标点符号,空格,leet-speak和其他语言。所有这些都使正则表达式作为解决方案不那么吸引人。以下是使用单词hello的一些示例(假设它是本练习的亵渎):

  • 列表项
  • h l l l o
  • h.e.l.l.o
  • h_e_l_l_o
  • | - | ELLO
  • h3llo
  • “你好那里”(这句话可能不包含任何亵渎的词语,但结合起来却是亵渎的)

您还需要处理边缘情况,其中两个或多个字典(白名单)单词彼此相邻时包含亵渎语言。一些包含s-word的例子:

  • bash it
  • ssh这是安静的时间

这些显然不是亵渎,但大多数本土和许多商业解决方案都存在问题。

我们花了最近3年的时间来完善CleanSpeak使用的过滤器,以确保它能够处理所有这些情况,并且我们会继续调整它并使其更好。我们还花了8个月来完善我们的性能系统,它每秒可以处理大约5,000条消息。并不是说你不能构建可用的东西,而是准备好处理可能出现的很多问题,并且还要创建一个不使用正则表达式的系统。

答案 2 :(得分:0)

我正在研究这个早期的正则表达式,它应该匹配空格和其他字符:

/^f(\s|.{1,2})?o?(\s|.{1,2})?o.*$/gi

验证:

foo

f.o.o

foobar