【问题标题】:Find the best match on multiple keywords with regular expression in JS在 JS 中使用正则表达式在多个关键字上找到最佳匹配
【发布时间】:2016-02-26 11:23:12
【问题描述】:

我正在尝试在 JS 中使用正则表达式来检查数组的内容是否可以匹配特定的字符串。字符串可以由许多单词组成,内容的数组也是如此。 我的问题是:

var myQuery = "I am looking for the red bike";
var myArray = [{kid:24,keyword:"red"}, {kid:32,keyword:"bike"}, {kid:51,keyword:"red bike"}];

在这种情况下,我不想只得到“红色”或“自行车”,而是“红色自行车”,因为它是最佳匹配。 现在我恢复了请求,但还没有确定:

myArray.some(function (el) {
    var myRegEx = new RegExp(el.keyword, "gi");
    if (myRegEx.test(myQuery)) {
        return true;
    }
});

它匹配“红色”。 只有当我的查询是:

var myQuery = "I am looking for the red car";

所以我真的不习惯正则表达式,所以如果有人可以帮助我,那就太好了。

【问题讨论】:

  • 您是否考虑过使用更大的功能,使用单独的正则表达式测试器?我正在考虑使用一系列 if 语句。 if MyText contains 'red', add red to $Result. If MyText contains 'bike', add bike to $Result ...
  • 这看起来不是一个非常持久的解决方案,不是吗?据我了解您的想法,不可能组合很多不同的查询,如果我有一个包含 4000 个项目的数组,那将是一场噩梦......
  • 我已经设置了一个临时解决方案,目前似乎可以完成这项工作。我正在检查所有找到的结果并比较它们的长度。如果我只保留更长的关键字,那将意味着参数是组合的一个:if(myRegEx.test(myQuery)){if(el.keyword.length>answer.length){answer = el.keyword;}}。但如果有更清洁的解决方案,我仍然可以做到。

标签: javascript arrays regex


【解决方案1】:

您可以使用Levenshtein distance 实现,即计算两个字符串之间的差异或距离(myQuery 与每个项目keyword),然后对数组进行排序并返回具有最短距离的keyword 作为最佳匹配.

您可以找到 Levenshtein javascript 实现 here(尚未测试与其他相比有多好)

var myQuery = "I am looking for the red bike";
var myArray = [{kid:24,keyword:"red"}, {kid:32,keyword:"bike"}, {kid:51,keyword:"red bike"}];

function bestMatch() {
   var temp = myArray.map(function(item) {
     item.distance = getEditDistance(myQuery, item.keyword)
     return item;
   })
   temp.sort(function(a,b) {
     if (a.distance < b.distance) return -1
     else if (a.distance > b.distance) return 1
     else return 0;
   })
   return temp[0].keyword
}

console.log('Best matching keyword is :', bestMatch());

演示 -> http://jsfiddle.net/hoo207o3/

【讨论】:

  • 我从未听说过 Levenshtein 距离。我去看看。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多