JavaScript没有返回预期的正则表达式结果

时间:2015-06-18 17:29:25

标签: javascript regex

我正在抽象我的代码,因为它最终会进入商业产品。我在进行正则表达式测试时遇到了一些麻烦,无法返回正确的结果。

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上重复这个。

3 个答案:

答案 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'标志

了解lastIndex