【问题标题】:JavaScript not returning expected regex results [duplicate]JavaScript没有返回预期的正则表达式结果[重复]
【发布时间】:2015-06-18 17:29:25
【问题描述】:

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

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

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    使用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)

    【讨论】:

    • 做到了。我创建了一些包含所有字母/数字字母的测试文件以进行确认,并且可以正常工作。谢谢!
    • @user2684405 不客气。很高兴帮助:)
    【解决方案2】:

    在 RegExp 上调用 test 时,它会维护最后一个匹配项的 lastIndex 属性(有关详细信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)。 下次您搜索(甚至在另一个字符串中)时,lastIndex+1 是搜索的起始位置。

    防止这种情况发生的最简单方法是在正则表达式定义中省略全局标志(我认为在这种情况下不需要),或者在 searchFilter 函数的每次迭代中将 lastIndex 重置为 -1。

    【讨论】:

      【解决方案3】:

      当 global(g) 标志与 test() 或 exec() 一起使用时,lastIndex 设置为最近匹配的下一个位置。您要么必须将 filter.lastIndex 重置为 0,要么实际上可以省略 'g' 标志

      了解lastIndex

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-04
        • 2016-10-10
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-29
        相关资源
        最近更新 更多