Javascript全局匹配捕获组

joh*_*trs 6 javascript regex

任何人都可以告诉我为什么第二个片段在使用g旗帜时没有捕获'组' ?

  "123".match(/(\d{1})(\d{1})/)    // returns  ["12", "1", "2"]
  "123".match(/(\d{1})(\d{1})/g)   // returns ["12"]   (where's 1 and 2 ?)
Run Code Online (Sandbox Code Playgroud)

console.log("123".match(/(\d{1})(\d{1})/))    // returns  ["12", "1", "2"]

console.log("123".match(/(\d{1})(\d{1})/g))   // returns ["12"]   (where's 1 and 2 ?)
Run Code Online (Sandbox Code Playgroud)

Pra*_*lan 12

根据MDN文档:

如果正则表达式不包含g标志,则返回与RegExp.exec()相同的结果.返回的Array有一个额外的input属性,它包含已解析的原始字符串.此外,它还有一个index属性,表示字符串中匹配的从零开始的索引.

如果正则表达式包含g标志,则该方法返回包含所有匹配的子字符串而不是匹配对象的Array.捕获的组不会被退回.如果没有匹配项,则该方法返回null.


如果要获取捕获组并设置全局标志,则需要使用RegExp.exec().

var myRe = /(\d)(\d)/g;
var str = '12 34';
var myArray;
while (myArray = myRe.exec(str)) {
  console.log(myArray);
}
Run Code Online (Sandbox Code Playgroud)