正则表达式匹配词

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 >

【讨论】:

以上是关于正则表达式匹配词的主要内容,如果未能解决你的问题,请参考以下文章

php 正则匹配HTML标签以外的匹配词 并且不匹配A标签中的匹配词

在 dart 中使用动态全词匹配正则表达式过滤列表

正则表达式 - 使用否定环视匹配同句中的单词

elasticsearch通配符和正则表达式查询

用JAVA语言编写正则表达式匹配指定的汉字的方法

正则表达式查找单词的最佳匹配子集