在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+)
,它是捕获组。