Javascript 在JS中使用正则表达式查找多个关键字的最佳匹配

Javascript 在JS中使用正则表达式查找多个关键字的最佳匹配,javascript,arrays,regex,Javascript,Arrays,Regex,我试图在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"}]; 在这种情况下,我不想只得到“红色”或“自行车”,而是“红色自行车”,因为它是最好的匹

我试图在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";
所以我真的不习惯正则表达式,所以如果有人能帮助我,那就太好了。

您可以使用一个实现,即计算两个字符串之间的差异或距离(
myQuery
vs每个项
关键字
),然后对数组排序并返回距离最小的
关键字
,作为最佳匹配

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

var myQuery=“我在找那辆红色的自行车”;
var myArray=[{kid:24,关键字:“红色”},{kid:32,关键字:“自行车”},{kid:51,关键字:“红色自行车”}];
函数bestMatch(){
var temp=myArray.map(函数(项){
item.distance=getEditDistance(myQuery,item.keyword)
退货项目;
})
温度排序(功能(a、b){
如果(a.distanceb.distance)返回1
否则返回0;
})
返回临时值[0]。关键字
}
log('最佳匹配关键字为:',最佳匹配());

演示->

您是否考虑过使用更大的功能,使用单独的reg ex测试仪?我正在考虑使用一系列if语句<代码>如果MyText包含“红色”,则将红色添加到$Result。如果MyText包含“bike”,请将bike添加到$Result…它看起来不是一个非常持久的解决方案,不是吗?我理解你的想法,不可能组合很多不同的查询,如果我有一个包含4000项的数组,那将是一场噩梦……我已经设置了一个临时解决方案,目前似乎可以完成这项工作。我正在检查所有找到的结果并比较它们的长度。如果我只保留较长的关键字,这将意味着参数是组合的:
If(myRegEx.test(myQuery)){If(el.keyword.length>answer.length){answer=el.keyword;}}
。但如果有一个更干净的解决方案,我仍然能做到。我从来没有听说过莱文施坦距离。我来看看。非常感谢。
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());