首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >过滤匹配字符序列的JavaScript字符串数组

过滤匹配字符序列的JavaScript字符串数组
EN

Stack Overflow用户
提问于 2018-06-19 11:22:48
回答 4查看 6.5K关注 0票数 3

如何有效地过滤与字符序列匹配的字符串数组,以便字符可以在字符串中的任何位置匹配,但按使用顺序匹配?

这是编辑器和IDE中常见的一个功能,可以快速过滤文件名。

在附加的图像链接中查看滤镜的运行情况的插图。

这不是JavaScript autocomplete without external library的副本,因为这里的其中一个要求是用户输入"Caz“与这个问题的答案中解释的”Caz“匹配,但在其他问题的答案中没有。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-19 11:44:42

我想这应该很接近了。答案尝试构建一个正则表达式,以使字符按照它们在搜索词中出现的顺序进行匹配。

代码语言:javascript
运行
复制
const values = ['Brussels', 'Cairo', 'Casablanca', 'Cangzhou', 'Caracas',
    'Los Angeles', 'Osaka'];

const match = (s) => {
  const p = Array.from(s).reduce((a, v, i) => `${a}[^${s.substr(i)}]*?${v}`, '');
  const re = RegExp(p);
  
  return values.filter(v => v.match(re));
};

console.log(match('Ca'));    // Cairo, Casablanca, Cangzhou, Caracas
console.log(match('Caz'));   // Cangzhou
console.log(match('as'));    // Casablanca, Caracas
console.log(match('aa'));    // Casablanca, Caracas, Osaka

票数 3
EN

Stack Overflow用户

发布于 2019-11-29 19:02:17

这实际上比看起来简单。此外,目前接受的解决方案实际上并不一致。

您只需构造一个正则表达式,该正则表达式接受搜索字符串的每个字符之间的0个或更多个字符。

代码语言:javascript
运行
复制
const values = ['Belgium', 'Brest', 'Britian']
const query = 'Be'

// /.*b.*e.*/
const re = RegExp(`.*${query.toLowerCase().split('').join('.*')}.*`)

// [ 'Belgium', 'Brest' ]
const matches = values.filter(v => v.toLowerCase().match(re))
票数 3
EN

Stack Overflow用户

发布于 2018-06-19 11:50:11

这里有一个这样的例子。

为了减少意外错误,您应该将输入值限制为您希望它们键入的值。

代码语言:javascript
运行
复制
var all = ['test','string','array','example'];

function getMatch(arr, str){
  var reg = new RegExp(str.split('').join('.*'), 'i');
  
  return arr.filter(function(item) {
    if (item.match(reg)) {
      return item;
    }
  });
}

function search(value){
  document.getElementById("result").innerHTML = getMatch(all, value);
}
代码语言:javascript
运行
复制
<input type="text" onkeyup="search(this.value)">
<br />
<span id="result"></span>

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50920180

复制
相关文章

相似问题

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