如何有效地过滤与字符序列匹配的字符串数组,以便字符可以在字符串中的任何位置匹配,但按使用顺序匹配?
这是编辑器和IDE中常见的一个功能,可以快速过滤文件名。
在附加的图像链接中查看滤镜的运行情况的插图。

这不是JavaScript autocomplete without external library的副本,因为这里的其中一个要求是用户输入"Caz“与这个问题的答案中解释的”Caz“匹配,但在其他问题的答案中没有。
发布于 2018-06-19 11:44:42
我想这应该很接近了。答案尝试构建一个正则表达式,以使字符按照它们在搜索词中出现的顺序进行匹配。
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
发布于 2019-11-29 19:02:17
这实际上比看起来简单。此外,目前接受的解决方案实际上并不一致。
您只需构造一个正则表达式,该正则表达式接受搜索字符串的每个字符之间的0个或更多个字符。
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))发布于 2018-06-19 11:50:11
这里有一个这样的例子。
为了减少意外错误,您应该将输入值限制为您希望它们键入的值。
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);
}<input type="text" onkeyup="search(this.value)">
<br />
<span id="result"></span>
https://stackoverflow.com/questions/50920180
复制相似问题