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