如何搜索与其他单词类似的单词?

时间:2018-05-14 21:23:56

标签: javascript arrays node.js string


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

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

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);

编写此代码的目的是允许我使用字典列表对此密码的所有组合以及内部单词进行强制执行。

cryptogram sheet

4 个答案:

答案 0 :(得分:3)

我真的建议你阅读 Levenshtein距离 声音与你想要在这里实现的完全一样

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

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

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

     

示例Levenshtein距离&#34;小猫&#34;和&#34;坐着&#34;是3,   因为以下三个编辑将一个改变为另一个,并且在那里   用不到三次编辑的方法来做到这一点:

     

小猫坐着(取代&#39;&#39;用&#39;&#39;)

     

sitten sittin(替换&#39; e&#39;以及#39; i&#39;)

     坐着(在最后插入&#39; g)。

答案 1 :(得分:2)

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

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

&#13;
&#13;
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']));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

嘿,我认为这应该有效。如果您不理解某个部分,请尝试在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);

答案 3 :(得分:1)

另一种方法可能就像;

&#13;
&#13;
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);
&#13;
&#13;
&#13;