【问题标题】:How do I search for words similar to other words?如何搜索与其他单词相似的单词?
【发布时间】:2026-02-24 00:25:02
【问题描述】:


我希望在 Node.js 中制作一个小脚本,它将单词与另一个相似的单词进行匹配。例如,我正在搜索***ing,并且我有一个类似['loving', 'mating', 'cats', 'wording'] 的数组,那么我希望它返回['loving', 'mating'] 并排除['cats'](因为它不以ing 结尾),和['wording'](因为它是七个字符而不是六个。)。

这是我当前编写的工作代码。

let foundWords = [];
for (let i = 0, len = wordList.length; i < len; i++) {
  for (let j = 0, len = wordList[i].split('').length; j < len; j++) {
    if (wordToFind.charAt(j) == '*') {
      return;
    };
    if (wordToFind.charAt(j) === wordList[i].charAt(j)) {
      if (foundWords.includes(wordList[i]) == false) {
        foundWords.push(wordList[i]);
      };
    }
  }  
}
console.log(foundWords);

编写此代码的目的是让我可以使用字典来暴力破解此密码的所有组合以及其中的单词。

【问题讨论】:

    标签: javascript arrays node.js string


    【解决方案1】:

    另一种方法可能是这样的;

    function getMatches(ts, ss){
      var es = ts.split(/\*+/)[1]; // or ts.match(/[^\*]+$/)[0];
      return ss.filter(s => s.endsWith(es) && s.length === ts.length)
    }
    
    var res = getMatches("***ing",['loving', 'mating', 'cats', 'wording']);
    console.log(res);

    【讨论】:

      【解决方案2】:

      嘿,我认为这应该可行。如果您不了解某个部分,请尝试在MDN 查找String.prototype 函数。了解其中的一些函数真的很有帮助,因为它会让你的代码更容易。

      let input = '***ing';
      let inputLength = input.length
      let results = [];
      
      while (input.charAt(0) === "*") {
        input = input.substr(1);
      }
      
      const arr = ['loving', 'mating', 'cats', 'wording'];
      
      
      for (let i = 0; i < arr.length; i++) {
      
        if (inputLength != arr[i].length) {
          continue;
        }
      
        if(arr[i].indexOf(input) != -1) {
          results.push(arr[i]);
        }
      }
      
      console.log(results);

      【讨论】:

      • 顺便说一句,虽然这个作品使用 4castle 解决方案,但更优雅。
      【解决方案3】:

      我真的建议您阅读 Levenshtein 距离 听起来和你在这里想要实现的完全一样

      https://en.wikipedia.org/wiki/Levenshtein_distance#Example

      java脚本中的一个实现 https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript

      在信息论和计算机科学中,Levenshtein 距离 是衡量两个之间差异量的指标 序列(即编辑距离)。之间的 Levenshtein 距离 两个字符串被定义为需要的最小编辑次数 使用允许的编辑将一个字符串转换为另一个字符串 操作是插入、删除或替换单个 字符。

      示例“kitten”和“sitting”之间的 Levenshtein 距离为 3, 因为以下三个编辑将一个更改为另一个,并且 不是少于三个编辑的方法:

      kitten sitten(用“s”代替“k”)

      sitten sittin(用“i”代替“e”)

      坐着(在末尾插入“g”)。

      【讨论】:

        【解决方案4】:

        您可以将Array.prototype.filterRegExp 一起使用。

        要构造正则表达式,您需要将通配符 * 替换为正则表达式的通配符:.。然后添加^$ 来锚定正则表达式以匹配从字符串的开头到结尾。

        function filterMatches(needle, haystack) {
          const regex = new RegExp('^' + needle.replace(/\*/g, '.') + '$');
          return haystack.filter(word => regex.test(word));
        }
        
        console.log(filterMatches('***ing', ['loving', 'mating', 'cats', 'wording']));

        【讨论】: