1

如何使用 Java 正则表达式匹配被禁止的单词,例如,如果我想禁止单词 stackoverflow,它将匹配 stackoverflow、stackoverflow 和 stackoverflow。

这样做的目的是阻止人们在聊天中说禁止的话。正则表达式也必须工作,以便它们可以是任何一方的任何东西。例如“转到 stackoverflow,它是一个很好的网站”会检测到 stackoverflow。

4

2 回答 2

1

你可以做的是去掉这里所有的非字母数字字符,然后匹配你的禁用词。但这并不能完全消除向听众传达脏话的机会。例如人们可以使用人类认知系统无论如何都能理解的leet,例如“Long”这个词可以写成“| 0ng”,为了保持简洁,我不会使用真实的例子。例如“亚历山大”可以是“/\ | 3 >< /\ |\| c| 3 r”

于 2013-01-21T19:06:13.383 回答
0

尽管您要求的是基于正则表达式的特定答案,但正则表达式并不总是可以扩展到所需的内容:尤其是在处理不稳定的人工输入时。

有一些字符串相似性算法,当与 Fairmutex 的答案这样的简单初步阶段结合使用时,可以提供更全面的禁止过滤器。

一种流行的算法是Levenshtein Distance。虽然它很快,但它很大程度上基于单词的顺序,因此在“溢出堆栈”的输入中搜索“堆栈溢出”会给你一个否定的结果。

对于我以前的项目,我使用了这种巧妙的算法,它考虑了后一种困境。虽然它有点重,但它比正则表达式和 Levenshtein Distance 做得更好。

另一个想法是通过我之前链接的 Strike-a-Match 算法运行输入,如果输入低于特定的相似度阈值(例如,50%+ 匹配),则运行特定的通用 leet 过滤器。这将在替换常用的 leet speak 的基础上起作用。例如“|\|” 无论间距如何,都会被“n”替换。

于 2013-02-21T01:09:27.537 回答