.match在JavaScript中未按预期工作

.match在JavaScript中未按预期工作,javascript,regex,Javascript,Regex,假设以下代码: "ab00ab____ab01ab".match(/ab(.+)ab/); 我想让它得到00和01,但它却返回了以下内容: ["ab00ab____ab01ab", "00ab____ab01"] 如何解决此问题?在带有/ab(+?)ab/g的循环中使用RegExp#exec: var s=“ab00ab\uuuuuuuuuu01ab”; var re=/ab(+?)ab/g; var-res=[]; while((m=re.exec))!==null){ res.push

假设以下代码:

"ab00ab____ab01ab".match(/ab(.+)ab/);
我想让它得到
00
01
,但它却返回了以下内容:

["ab00ab____ab01ab", "00ab____ab01"]
如何解决此问题?

在带有
/ab(+?)ab/g的循环中使用
RegExp#exec

var s=“ab00ab\uuuuuuuuuu01ab”;
var re=/ab(+?)ab/g;
var-res=[];
while((m=re.exec))!==null){
res.push(m[1]);
}

控制台日志(res)@MarioAlexandroSantini:你错了,因为我的正则表达式与空字符串不匹配。每次成功匹配后,
RegExp
类的
lastIndex
属性将自动提升。如果不存在匹配项,
m
为空。问题不是当您有空字符串时。在这种情况下,您只需跳过这段时间。我认为re.exec()总是作为无限循环中的结果进行匹配。无论如何,你的代码是危险的,就好像你从正则表达式中删除了g标志,你就有了一个无限循环。@MarioAlexandroSantini:如果我要从正则表达式中删除
/g
,我不会使用
RegExp.exec
,因为如果使用不带全局修饰符的regex,而带有
RegExp\exec
的话,
lastIndex
属性将不会自动升级。在发布这些评论之前,您应该已经阅读了有关该行为的信息。你做出了错误的假设,这段代码是完全安全的,它不能运行在无限循环中。这就是问题所在,在你的例子中,一切都很好,因为只有几行代码。在实际代码中,可以动态地分配正则表达式,也可以从您使用的代码中分配数百行或数千行。因此,删除g标志将导致一个无限循环可能不是很明显。这是因为regexp随输入数据而更改。但这只是对更强大代码的考虑。无论如何,谢谢你,因为我今天学到了一个新的想法。如果OP提到任何关于模式重用的东西,我会推荐一些不同的东西。现在,解决方案是为当前任务量身定制的。我必须指出,仅仅访问捕获组并不能解决当前问题,而且问题无法解决。我的回答是否澄清了问题?