我正在抽象我的代码,因为它最终会进入商业产品。我在进行正则表达式测试时遇到了一些麻烦,无法返回正确的结果。
var files = [
"Jurassic%20Park%20-%20Nedry.mp4",
'Jeb%20Corliss%20Grinding%20The%20Crack.mp4'
];
var filterSearch = function(text){
var filter = new RegExp(text, 'gi');
var displayFiles = files.filter(function(file){
return filter.test( file.toLowerCase());
});
console.log(displayFiles);
}
如果我运行filterSearch('J')或filterSearch('N')我希望得到2个结果,Jurassic Park和Jeb,而不是我只得到一个。它似乎适用于两个文件之间共享的所有其他字符,但不适用于J或N.有谁知道为什么这对我不起作用? 谢谢,
编辑:我可以在repl.it上重复这个。
答案 0 :(得分:3)
使用String.prototype.search()
代替test()
功能。
示例强>
var filterSearch = function(text){
var filter = new RegExp(text, 'gi');
var displayFiles = files.filter(function(file){
return file.search(filter) != -1 ? true : false ;
});
console.log(filter);
console.log(displayFiles);
}
filterSearch('J');
会给你一个输出
["Jurassic%20Park%20-%20Nedry.mp4", "Jeb%20Corliss%20Grinding%20The%20Crack.mp4"]
这是因为在同一个全局正则表达式实例上多次调用的test()
将超过上一个匹配。 (As stated per the MDN reference)
答案 1 :(得分:0)
在RegExp上调用test时,它会维护最后一个匹配的lastIndex属性(有关详细信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)。 下次搜索时(即使在另一个字符串中),lastIndex + 1是搜索的起始位置。
防止这种情况的最简单方法是在正则表达式定义中省略全局标志(在我看来这不是必需的)或者只是在searchFilter函数的每次迭代中将lastIndex重置为-1。
答案 2 :(得分:0)
当global(g)标志与test()或exec()一起使用时,lastIndex被设置为最近匹配的下一个位置。你要么必须将filter.lastIndex重置为0,要么你实际上可以省略' g'标志