正则表达式匹配词
Posted
技术标签:
【中文标题】正则表达式匹配词【英文标题】:Regex Matching Words 【发布时间】:2013-01-04 21:40:47 【问题描述】:如何使用 Java 正则表达式来匹配被禁止的单词,例如,如果我想禁止单词 ***,它将匹配 ***、s t a c k o v e r f l o w 和 s-t-a-c-k-o-v-e-r-f-l-o-w。
这样做的目的是阻止人们在聊天中说禁止的话。正则表达式也必须工作,以便它们可以是任何一方的任何东西。例如“Go to ***, its a good website”会检测到 ***。
【问题讨论】:
A clbuttic mistake. 人们拥有绕过禁用词过滤器的不可思议的能力。 Here's 一个正则表达式,可与 replaceAll 一起使用以删除所有非字母数字字符。 确保匹配 stack0verflow、stackoverfl0w、st4ckoverflow、stackov3rflow 和 5+4 【参考方案1】:尽管您要求的是专门基于正则表达式的答案,但正则表达式并不总是能够满足需要:尤其是在处理不稳定的人工输入时。
有一些字符串相似性算法,当与 Fairmutex 的回答这样的简单初步阶段相结合时,可以提供更全面的禁止过滤器。
使用的一种流行算法是Levenshtein Distance。虽然速度很快,但它在很大程度上基于单词的顺序,因此在“溢出堆栈”的输入中搜索“堆栈溢出”会给你一个否定的结果。
对于我以前的项目,我使用了this 聪明的算法,它考虑了后一种困境。虽然它有点重,但它比正则表达式和 Levenshtein Distance 做得更好。
另一个想法是通过我之前链接的 Strike-a-Match 算法运行输入,如果输入的相似度超过特定阈值(例如,50%+ 匹配),则运行特定的 general-leet筛选。这将在替换常用的 leet speak 的基础上起作用。例如“|\|”无论间距如何,都会被替换为“n”。
【讨论】:
【参考方案2】:您可以做的是去除所有非字母数字字符here,然后匹配您的禁用词。但这并不能完全消除向听众传达脏话的机会。例如,人们可以使用人类认知系统无论如何都能理解的 leet,例如“Long”这个词可以写成“|0ng”,为了保持简洁,我不会使用真实的例子。例如“亚历山大”可以是“/\ | 3 >
【讨论】:
以上是关于正则表达式匹配词的主要内容,如果未能解决你的问题,请参考以下文章