如何使用Java Regex来匹配禁止的单词,例如,如果我想禁用stackoverflow这个词,它将匹配stackoverflow,s t a c k o v e w l w和s-t-a-c-k-o-v-e-r-f-l-o-w。
这样做的目的是阻止人们在聊天中说禁止的话。正则表达式也必须工作,以便它们可以是任何一方的任何东西。例如,“转到stackoverflow,它是一个很好的网站”会检测到stackoverflow。
答案 0 :(得分:1)
您可以做的是删除所有非字母数字字符here,然后匹配您的禁止字词。但这并不能完全消除向观众传达犯规的机会。例如,人们可以使用人类认知系统可以理解的leet,例如单词“Long”可以写成“| 0ng”我不会使用真实的例子来保持它的清洁。例如“亚历山大”可以是“/ \ | 3>< / \ | \ | c | 3 r”
答案 1 :(得分:0)
虽然你要求一个特定的基于正则表达式的答案,但正则表达式并不总是可以扩展到需要的东西:特别是在处理不稳定的人类输入时。
有一些字符串相似性算法,当与Fairmutex的答案等简单的初步阶段相结合时,可以提供更全面的禁止过滤器。
使用的一种流行算法是Levenshtein Distance。虽然速度很快,但它主要依赖于单词的顺序,因此在“溢出堆栈”的输入中搜索“堆栈溢出”会给你一个负数。
对于我之前的项目,我使用了this聪明的算法,该算法考虑了后者的困境。虽然它有点重,但它比正则表达式和Levenshtein距离更好。
另一个想法是通过先前链接的Strike-a-Match算法运行输入,如果输入在相似性(例如,50%+匹配)之上超过特定阈值,则运行特定的通用leet过滤。这将在取代常用的leet发言的基础上发挥作用。例如“| \ |”无论间距如何,都会被“n”取代。