从给定的字符串中删除亵渎词的正确方法是什么:
1)我有一个包含 100 个单词的列表,要在字符串数组中查找。2)处理部分单词的正确方法是什么?大多数人是如何处理这个问题的?例如单词mass。然后有时部分词也不好 - 假设 foobar 是一个非常亵渎的词,我可能想要禁止 foobar 和 foobar* 和 *foobar。
那么,您是将所有单词放在一个表达式中还是在列表中循环?
解决它的正确方法是什么?我正在使用 Groovy/Grails,但欢迎任何现代语言示例。
从给定的字符串中删除亵渎词的正确方法是什么:
1)我有一个包含 100 个单词的列表,要在字符串数组中查找。2)处理部分单词的正确方法是什么?大多数人是如何处理这个问题的?例如单词mass。然后有时部分词也不好 - 假设 foobar 是一个非常亵渎的词,我可能想要禁止 foobar 和 foobar* 和 *foobar。
那么,您是将所有单词放在一个表达式中还是在列表中循环?
解决它的正确方法是什么?我正在使用 Groovy/Grails,但欢迎任何现代语言示例。
这是一个非常难以解决的问题,您需要确定正则表达式是否适合您以及如何处理嵌入(当您将字典中的单词添加到 frackface 之类的亵渎词中,但真正的 F 词除外)。
正则表达式通常对它们的长度有限制,这通常会阻止您对所有单词使用单个正则表达式。对一个字符串执行多个正则表达式真的很慢,这取决于你需要什么性能以及你的黑名单有多大。我们最初将 CleanSpeak实现为一个正则表达式系统,但它没有扩展,我们使用不同的机制重写了它。
您还需要考虑短语、标点符号、空格、leet-speak 和其他语言。所有这些都使正则表达式作为解决方案的吸引力降低。下面是一些使用 hello 这个词的例子(假设它是对这个练习的亵渎):
您还需要处理两个或多个字典(白名单)单词在彼此相邻时包含亵渎的极端情况。一些包含 s-word 的示例:
这些显然不是亵渎,但大多数本土和许多商业解决方案都存在这些案例的问题。
在过去的 3 年中,我们一直在完善CleanSpeak使用的过滤器,以确保它能够处理所有这些情况,并且我们继续对其进行调整并使其变得更好。我们还花了 8 个月的时间来完善我们的系统以提高性能,它每秒可以处理大约 5,000 条消息。并不是说您不能构建可用的东西,而是要准备好处理可能出现的许多问题,并创建一个不使用正则表达式的系统。
(foobar|foobaz|...)
然后在分组的两侧放置无关字符的警卫
[^!@#$%^&*]*(foobar|foobaz|foofii)[^!@#$%^&*]*
此外,您可能希望使用不区分大小写的标志,以便它也可以匹配 FooBaz 和 fOObaR 之类的单词。
就性能而言,将其连接为一个大的正则表达式可能是最快的(尽管我不是专家)。正则表达式算法在搜索和处理分支条件方面非常有效。基本上,它必须比O(mn)
(m
单词的数量和n
您正在搜索的文本的大小在哪里)
我正在研究这个正则表达式,它应该匹配空格,以及介于两者之间的其他字符:
/^f(\s|.{1,2})?o?(\s|.{1,2})?o.*$/gi
验证:
富
富
呵呵
富吧