2015-06-18 125 views
2

我抽象我的代码,因为它最终会进入商业产品。我有一些麻烦得到一个正则表达式测试返回正确的结果。JavaScript不返回预期的正则表达式结果

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个结果,侏罗纪公园和杰布,而是我正准备之一。它似乎适用于两个文件之间共享的所有其他字符,但不适用于J或N.有没有人知道为什么这不适合我? 谢谢,

编辑:我可以在repl.it上重复这一点。

回答

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

+0

这做到了。我创建了几个测试文件,其中包含字母/数字的所有字母以进行确认,并且工作正常。谢谢! – user2684405

+0

@ user2684405不客气。乐意效劳 :) – nu11p01n73R

0

当调用测试上一个RegExp它保持了最后一场比赛的lastIndex属性(参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test进一步的细节)。 下一次搜索(甚至在另一个字符串中)lastIndex + 1是搜索的起始位置。

最简单的方法是在正则表达式定义中忽略全局标志(在我看来这不是必需的),或者只是在searchFilter函数的每次迭代中将lastIndex重置为-1。

0

当全局(g)标志与test()或exec()一起使用时,lastIndex被设置为最近一次匹配的下一个位置。你将不得不filter.lastIndex重置为0或者你实际上可以忽略的“G”标志

阅读lastIndex

相关问题