JavaScript RegExp 不能使用两次?

标签 javascript regex

<分区>

我有一个非常严重的问题:

var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];
var searchreg = new RegExp("test","g");

cat.forEach(function(item){
  if(searchreg.test(item.slug)){
    console.log(item);
  } 
});

这应该从“cat”中打印出两个项目。但我只得到第一个。如果我添加更多项目,我只会每 2 次获得一次(从第一个开始)。

我得到了它:

var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];

cat.forEach(function(item){
  var searchreg = new RegExp("test","g");
  if(searchreg.test(item.slug)){
    console.log(item);
  } 
});

但我不明白为什么这不起作用(Chrome)-有人有想法吗?

最佳答案

这是因为 g(“全局”)标志。当您使用 g 标志时,RegExp 实例具有状态:它们会记住它们看到的最后一次匹配的位置,因此它们可以从该点继续(例如,如果您在循环中使用它们)。 (是的,这不是最好的设计。)所以第一次,它在字符串中找到 test(并注意到它不在 end字符串);第二次,它试图从之前的位置找到在之前的字符串中继续的 test,当然没有找到。第三次,因为它知道上次输入用完了,所以它再次查看输入。

在你的情况下,因为你不需要比第一个实例更进一步的搜索,只需删除 g 标志:

var searchreg = /test/; // That's a regex literal, basically: ... = new RegEx("test")

或者,您可以通过将 0 分配给它的 lastIndex 属性来重置它:

searchreg.lastIndex = 0;
if (searchreg.test(item.slug))

或者,在这个特定用例中,您根本不需要正则表达式:

if (item.slug.indexOf("test") !== -1) {
    // It has "test" in the slug
}

关于JavaScript RegExp 不能使用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24084926/

相关文章:

javascript - Fetch API 是 ECMAscript 功能吗?

javascript - 使用 JavaScript 包装一组 DOM 元素

javascript - 在文本区域中,键入时将两个\n 替换为制表符缩进

java - 如果字符串 *仅* 包含字符集中的 *所有* 字符,加上一个可选字符,则匹配正则表达式

java - 在 Java 中创建有效的文件名

javascript - 该页面是通过 HTTPS 加载的,但请求了一个不安全的 XMLHttpRequest 端点

javascript - 具有逐字同步功能的 AVSpeechSynthesizer

javascript - 删除具有特定名称的 div

regex - 在 Powershell 中使用函数替换

javascript - 逗号前面或结尾逗号的正则表达式