Javascript JS regexp:匹配重复模式

Javascript JS regexp:匹配重复模式,javascript,regex,Javascript,Regex,我想知道为什么这些regexp不是等价的: /(a)(a)(a)/.exec ("aaa").toString () => "aaa,a,a,a" , as expected /(a){3}/.exec ("aaa").toString () => "aaa,a" :( /(a)*/.exec ("aaa").toString () => "aaa,a" :( 必须如何重新制定后两个,使其行为与前两个相同?重要的是,我希望匹配并记住任意倍数

我想知道为什么这些regexp不是等价的:

/(a)(a)(a)/.exec ("aaa").toString () => "aaa,a,a,a" , as expected
/(a){3}/.exec ("aaa").toString ()    => "aaa,a"      :(
/(a)*/.exec ("aaa").toString ()      => "aaa,a"      :(
必须如何重新制定后两个,使其行为与前两个相同?重要的是,我希望匹配并记住任意倍数

下一行

/([abc])*/.exec ("abc").toString () => "abc,c"

建议每个括号只保存一个字符-最后一个匹配项。

您可能正在查找以下内容:

var re = /([abc])/g,
    matches = [],
    input = "abc";
while (match = re.exec(input)) matches.push(match[1]);

console.log(matches);
//=> ["a", "b", "c"] 

请记住,任何匹配组都会为您提供最后匹配的模式,而不是所有模式。

RegExBuddy对此描述得非常好:

注意:您重复了捕获组本身。该小组将捕获 只有最后一次迭代


前几天我正试图解决这个问题。如果你搜索的话,还有其他关于这个问题的话题。简而言之,这在JS中是不受支持的
:(
Indeed您能举例说明您在何处遇到此问题。例如,您想要匹配的示例字符串和您想要的返回值。“aaa”中出现差异的原因这只是因为有不同数量的捕获组。我只是尝试用regexp实现字符串的分解函数,并希望进一步进行语法分析。我通过
str.match(/([^\n\t\(\)]+\(\)/g)绕过了这个问题
-这也将括号视为标记。但我认为这并不是问题的解决方案。如果您只匹配
(a)(a)(a)
,这将非常有效。如果您想匹配
(a)(b)*(c)
,你必须切掉字符串,这是不幸的!从功能上来说,这就是我想要的。我只是认为regexp为我做这件事一定是可能的,或者是很好的。但我担心它必须手工编码;)是的,这是真的,这是你能得到的最好的答案。如果成功了,你可以点击我答案左上角的勾号将答案标记为已接受。这是我的第二个问题,也是关于stackoverflow的第一次真实对话:D。我很少需要问,因为这里有很多好的答案。再次感谢!