首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按最大匹配排序字符串匹配结果

按最大匹配排序字符串匹配结果
EN

Stack Overflow用户
提问于 2017-03-01 14:11:23
回答 2查看 115关注 0票数 1

我想搜索一个字符串中的所有匹配,并返回所有按最大匹配结果排序的结果,假设我有一些字符串:

代码语言:javascript
复制
var strArray = [
  "This is my number one string",
  "Another string that contains number",
  "Just for example string"
];

// Results of search "another number" should be:
var resultArrayOfIndexes = [1, 0];

到目前为止,我可以在一个字符串中进行搜索,但它会返回至少有一个匹配的所有索引,但我希望结果数组按最大匹配数排序。我的代码:

代码语言:javascript
复制
function findMatch(list, phrase) {
  var preparedList = [],
    value = "";
  if (config.get("list").match.enabled) {
    for (var i = 0, length = list.length; i < length; i += 1) {

      value = config.get("getValue")(list[i]);
      var words = phrase.split(' ');
      var listMatchArr = [];
      $.each(words, function(idx, word) {
        var W = word.replace(/[\W_]+/g, ""); // match on alphaNum chars only
        if (match(value, W) && $.inArray(i, listMatchArr) == -1) { //phrase
          preparedList.push(list[i]);
          listMatchArr.push(i);
        };
      });

    }

  } else {
    preparedList = list;
  }

  return preparedList;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 14:33:33

我假设需要不区分大小写的搜索。

下面的代码将短语更改为单个单词的数组,然后映射列表以获取{index: 0, matches:1}形式的对象数组,然后过滤掉没有匹配的对象,然后排序,然后再次映射以仅获取索引。

代码语言:javascript
复制
function findMatch(list, phrase) {
  var searchTerms = phrase.toLowerCase().split(/\s+/);
  return list.map(function(v, i) {
    v = v.toLowerCase();
    return {
      index: i,
      matches: searchTerms.reduce(function(a, c) {
        return a + (v.indexOf(c) !=-1 ? 1 : 0);
      }, 0)
    };
  })
  .filter(function(v) { return v.matches > 0; })
  .sort(function(a, b) { return b.matches - a.matches; })
  .map(function(v) { return v.index; });
}

var strArray = [
"This is my number one string", "Another string that contains number","Just for example string"
];

console.log(findMatch(strArray, "another number"));

或者扩展以下内容,以获得与ES6功能基本相同的功能:

代码语言:javascript
复制
function findMatch(list, phrase) {
  var searchTerms = phrase.toLowerCase().split(/\s+/);
  return list.map(function(v, i) {
    v = v.toLowerCase();
    return {
      index: i,
      matches: searchTerms.reduce((a, c) => a + (v.includes(c) ? 1 : 0), 0)
    };
  })
  .filter(v => v.matches > 0)
  .sort((a, b) => b.matches - a.matches)
  .map(v => v.index);
}

var strArray = [
"This is my number one string", "Another string that contains number","Just for example string"
];

console.log(findMatch(strArray, "another number"));

票数 0
EN

Stack Overflow用户

发布于 2017-03-01 14:57:52

如果您熟悉正则表达式,则可以使用正则表达式来匹配您的短语,并计算字符串中有多少个单词匹配。假设您还想知道有多少个单词被匹配,您可以将其存储为一个对象数组,其中每个对象都存储计数数和目标字符串。

代码语言:javascript
复制
var strArray = [
    "This is my number one string", "Another string that contains number", "Just for example string"
];

function findMatch(list, phrase){
    var words = phrase.split(" ");

    var pattern = "";
    var length = words.length;
    // create pattern for regex match
    for(var i = 0; i < length; i++){
        pattern += words[i];
        if(i < length-1){
            pattern += "|";
        }
    }

    var counts = [];
    var re = new RegExp(pattern,"g");
    for(var i = 0; i < list.length; i++){
        var count = (list[i].toLowerCase().match(re) || []).length;
        //add to array if matched
        if(count > 0){
            counts.push({count:count,string:list[i]});
        }
    }
    //sort by max match 
    counts.sort(function(a,b){
        return b.count-a.count;
    });

    console.log(counts);
}

findMatch(strArray, "another number");

结果将如下所示:

代码语言:javascript
复制
[ { count: 2, string: 'Another string that contains number' },
  { count: 1, string: 'This is my number one string' },
  { count: 0, string: 'Just for example string' } ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42524466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档