如何用Node.js编写脚本匹配符合通配符规则的相似单词?
解决通配符单词匹配的Node.js脚本问题
我来帮你搞定这个通配符匹配的问题!你想要实现的是匹配符合特定通配符模式的单词,比如用***ing筛选出长度为6且以ing结尾的单词,同时排除长度不符或者结尾不对的项,还要用这个脚本暴力破解密码图里的单词组合对吧?
先看看你现有代码的几个关键问题:
- 内部循环里用了
return,直接终止了整个函数,导致还没完成所有单词的检查就退出了 - 重复使用了
len变量,覆盖了外层循环的长度值,会导致循环逻辑混乱 - 没有先检查单词长度和模式长度是否一致,长度不符的单词也会进入匹配流程
- 通配符
*的处理逻辑错误,遇到*直接返回,而不是跳过该位置的匹配
下面给你两种可行的解决方案,你可以根据需求选择:
方案一:利用正则表达式(简洁高效)
把通配符模式转换成正则表达式,*替换为匹配任意字符的.,再加上开头^和结尾$锚点确保完全匹配,同时先检查长度优化性能:
const wordList = ['loving', 'mating', 'cats', 'wording']; const pattern = '***ing'; // 将通配符转换为正则表达式规则 const regexStr = '^' + pattern.replace(/\*/g, '.') + '$'; const matchRegex = new RegExp(regexStr); const foundWords = wordList.filter(word => { // 先校验长度,不一致直接跳过,减少正则匹配次数 if (word.length !== pattern.length) return false; return matchRegex.test(word); }); console.log(foundWords); // 输出: ['loving', 'mating']
方案二:逐字符手动匹配(更直观可控)
修复你原来的循环逻辑,正确处理通配符,先检查长度再逐字符比对:
const wordList = ['loving', 'mating', 'cats', 'wording']; const wordToFind = '***ing'; const foundWords = []; // 遍历每个单词 for (const word of wordList) { // 第一步:长度不一致直接跳过 if (word.length !== wordToFind.length) continue; let isMatch = true; // 逐字符比对模式和单词 for (let j = 0; j < wordToFind.length; j++) { const patternChar = wordToFind[j]; // 如果是通配符*,跳过当前位置的比对 if (patternChar === '*') continue; // 字符不匹配,标记为不匹配并退出内层循环 if (patternChar !== word[j]) { isMatch = false; break; } } // 匹配成功且未在结果数组中,添加进去 if (isMatch && !foundWords.includes(word)) { foundWords.push(word); } } console.log(foundWords); // 输出: ['loving', 'mating']
这两种方案都能正确筛选出你想要的单词,对于暴力破解密码图的场景,正则方案的性能会更好一些,尤其是当单词列表很大的时候。
附上你提到的密码图示例:
内容的提问来源于stack exchange,提问作者user7885981
相关产品推荐
相关产品推荐

