Javascript string.match拒绝返回多个匹配项的数组

Javascript string.match拒绝返回多个匹配项的数组,javascript,regex,string,Javascript,Regex,String,我有一个字符串,我希望它的格式如下: {List:[姓名:a、b、c][age:1、2、3]} 我的查询在javascript中如下所示: var str = "{List:[Names:a,b,c][Ages:1,2,3]}"; var result = str.match(/^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g); 注意:我知道使用这个正则表达式时,它将以类似“Ages:,,,”的形式传递,但目前我并不担心这一点 我本来

我有一个字符串,我希望它的格式如下:

{List:[姓名:a、b、c][age:1、2、3]}

我的查询在javascript中如下所示:

var str = "{List:[Names:a,b,c][Ages:1,2,3]}";
var result = str.match(/^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g);
注意:我知道使用这个正则表达式时,它将以类似“Ages:,,,”的形式传递,但目前我并不担心这一点

我本来想把这个拿回来的:

result[0] = "{List:[Names:a,b,c][Ages:1,2,3]}"
result[1] = "a,b,c"
result[2] = "1,2,3"
但是,不管我对正则表达式做了什么,它都拒绝返回一个包含多个匹配项的数组,我只是返回完整的字符串(因为它通过了,这是一个开始):


我已经看过了一大堆关于这里的问题,以及其他的“介绍”文章,但似乎没有一篇能解决这么基本的问题。我确信我忽略了一些愚蠢的事情,但我真的不知道它是什么:(

您正在寻找表单
needle.exec(haystack)

从我的控制台:

> haystack = "{List:[Names:a,b,c][Ages:1,2,3]}";
"{List:[Names:a,b,c][Ages:1,2,3]}"

> needle = /^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g ;
/^\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}$/g

> needle.exec(haystack);
["{List:[Names:a,b,c][Ages:1,2,3]}", "a,b,c", "1,2,3"]

因此,在JavaScript的正则表达式中应用全局标志的方式有所不同

.match
中,全局标志(
/g
结尾)将返回正则表达式与字符串匹配的每个事件的数组。没有该标志,
.match
将返回字符串中所有分组的数组

例如:

现在,如果我们删除
/g
标志:

// leaving str as above
results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/);
console.log(results)
//["{List:[Names:a,b,c][Ages:1,2,3]}", "a,b,c", "1,2,3"]
作为对
regex.exec
工作原因的说明

如果正则表达式不包含g标志,则返回与regexp.exec(字符串)相同的结果


RegExp
exec()
和字符串
match()
方法本质上是相同的,接收者和参数的角色是相反的。@Pointy不完全一样,根据:如果正则表达式包含g标志,该方法返回一个包含所有匹配项的数组。如果没有匹配项,该方法返回null。是的,当然是这样(facepalm).所以,说得清楚一点,在任何情况下,使用groupings和/g与.match一起使用都没有任何意义,对吗?这要看情况而定。你可以查询正则表达式的每个结果以获得更多信息。啊,我明白了。但是因为我在其中有^and$作为字符串的开头/结尾,所以使用/g是没有意义的。明白了!谢谢!啊,不,它不在那里。
var str = "{List:[Names:a,b,c][Ages:1,2,3]}";
str += str;
// removed ^ and $ for demonstration purposes
var results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/g)
console.log(results)
// ["{List:[Names:a,b,c][Ages:1,2,3]}", "{List:[Names:a,b,c][Ages:1,2,3]}"]
str = "{List:[Names:a,b,c][Ages:1,2,3]}{List:[Names:a,b,c][Ages:3,4,5]}";
results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/g);
console.log(results)
//["{List:[Names:a,b,c][Ages:1,2,3]}", "{List:[Names:a,b,c][Ages:3,4,5]}"]
// leaving str as above
results = str.match(/\{List:\[Names:([a-zA-z,]*)\]\[Ages:([0-9,]*)\]\}/);
console.log(results)
//["{List:[Names:a,b,c][Ages:1,2,3]}", "a,b,c", "1,2,3"]