如何统计用户输入中前5个高频出现的指定违禁词?
解决违禁词频率统计及取前5的问题
你的现有代码只能返回第一个匹配到的违禁词,完全没做频率统计,肯定满足不了需求。下面是实现你要的功能的完整方案:
步骤说明
- 计数统计:遍历所有违禁词,统计每个词在输入文本里的出现次数(要处理重复出现的情况)
- 过滤无效项:去掉那些没在文本里出现过的违禁词
- 排序取前5:按出现次数从高到低排序,取前5个后转换成指定格式
完整代码
// 转义正则特殊字符,避免违禁词里的特殊符号干扰匹配 const escapeRegExp = (str) => { return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); }; // 统计违禁词频率并返回前5 const getTopBadWords = (inputText, badWordsList) => { // 初始化计数对象 const countMap = {}; // 遍历每个违禁词,统计出现次数 badWordsList.forEach(word => { const regex = new RegExp(escapeRegExp(word), 'gi'); // g全局匹配,i不区分大小写(可选,根据需求调整) const matches = inputText.match(regex); countMap[word] = matches ? matches.length : 0; }); // 转换成数组并过滤掉计数为0的项,再按次数降序排序 const sortedBadWords = Object.entries(countMap) .filter(([word, count]) => count > 0) .sort((a, b) => b[1] - a[1]); // 取前5个,转换成"单词-出现次数"格式 return sortedBadWords.slice(0, 5).map(([word, count]) => `${word}-${count}`); }; // 测试示例 const textWords = '垃圾垃圾,混蛋!垃圾,笨蛋笨蛋笨蛋,混蛋'; const listOfBadWords = ['垃圾', '混蛋', '笨蛋', '傻瓜', '智障']; const top5 = getTopBadWords(textWords, listOfBadWords); console.log(top5); // 输出: ["笨蛋-3", "垃圾-3", "混蛋-2"]
代码解释
escapeRegExp:处理违禁词里的正则特殊字符(比如$、*这类),防止匹配出错getTopBadWords核心逻辑:- 用正则全局匹配每个违禁词,通过
match结果的长度得到出现次数 - 把计数对象转成键值对数组,过滤掉没出现的词后排序
- 截取前5个并转换成要求的格式
- 用正则全局匹配每个违禁词,通过
- 如果不需要不区分大小写的匹配,把正则里的
i去掉即可
内容的提问来源于stack exchange,提问作者Parcurcik
相关产品推荐
相关产品推荐

