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



从给定的字符串中删除亵渎词的正确方法是什么:
1)我有一个包含100个单词的列表,要在字符串数组中查找。2)如何正确处理部分词?大多数人是怎么处理的呢?比如mass这个词。然后有时部分单词也是不好的-假设foobar是一个非常亵渎的单词,我可能想要禁止foobar和foobar*和*foobar。

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

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

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

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

你还需要考虑短语、标点符号、空格、非正式用语和其他语言。所有这些都降低了正则表达式作为解决方案的吸引力。下面是一些使用hello这个词的例子(假设这个练习是亵渎):

    列表项
  • h.e.l.l.o
  • h_e_l_l_o
  • | - - - |嗨
  • h3llo
  • "hello there"(这个短语可能不包含任何亵渎的词语,但它们加在一起就是亵渎的)

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

    bash
  • ,
  • ssh是安静时间

这些显然不是亵渎,但大多数国产和许多商业解决方案在这些情况下都存在问题。

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

  1. 将每个单词连接到单词列表中- (foobar|foobaz|...)
  2. 然后在分组的两侧为多余的字符设置保护符

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

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

就性能而言,将其连接为一个大正则表达式可能是最快的(尽管我不是专家)。regex算法在搜索&处理分支条件。基本上,它必须优于O(mn)(其中m是单词数,n是您正在搜索的文本的大小)

我之前正在研究这个正则表达式,它应该匹配空格,以及中间的其他字符:

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

验证:foo

f.o.o

f oo

foobar

最新更新