在RegExp匹配上有说服力的Javascript循环

在RegExp匹配上有说服力的Javascript循环,javascript,regex,Javascript,Regex,以下内容让我有点困惑: var text = "A string with 3 numbers in it ... 42 and 88."; var number = /\b(\d+)\b/g; var match; while (match = number.exec(text)){ console.log("Found", match[1], "at", match.index); } 具体来说,我不明白这是如何产生“循环”效应的。如果它一直调用match[1],它如何在一个字符串

以下内容让我有点困惑:

var text = "A string with 3 numbers in it ... 42 and 88.";
var number = /\b(\d+)\b/g;
var match;
while (match = number.exec(text)){
    console.log("Found", match[1], "at", match.index);
}
具体来说,我不明白这是如何产生“循环”效应的。如果它一直调用
match[1]
,它如何在一个字符串中运行所有匹配项。exec是否有我不知道的副作用

编辑: 我仍然想知道
match[1]
是如何工作的。
匹配[1]
如何产生答案?当我自己测试这种类型的东西时,我得到了未定义的

> var y = /\d+/g.exec('5')
undefined
> y
[ '5', index: 0, input: '5' ]
> y[1]
undefined
这是怎么回事?它不是y[0],还是在上面的情况下匹配[0]?比如:

> y[0]
'5'

RegExp对象使用属性记住最后匹配的位置

引用

如果正则表达式使用
“g”
标志,则可以多次使用
exec()
方法来查找同一字符串中的连续匹配项。执行此操作时,搜索从正则表达式的
lastIndex
属性指定的str子字符串开始(
test()
还将推进
lastIndex
属性)


重要注意事项:引用章节第一行的第一部分很重要
如果正则表达式使用
“g”
标志
仅当正则表达式具有
g
标志时,您才会获得此行为。

除此之外,当您将
/g
添加到正则表达式时,您明确要求此行为。如果你删除了
/g
,你会发现令人惊讶的行为就消失了。@BenjaminGruenbaum我留下了一张关于它的便条。谢谢:-)@thefourtheye好的,我能理解。但是你没有真正回答我关于匹配[1]的问题。为什么它不匹配[0]。请看我编辑的文章。在第二种情况下,你没有一个括号。这就是为什么不存在
match[1]
的原因。在第一种情况下,您有
(\d+)
,它是捕获组。