JS正则表达式:匹配重复的模式

4
我想知道为什么这些正则表达式不等价:

我想知道为什么这些正则表达式不等价:

/(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"

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

我前几天也在尝试解决这个确切的问题。如果您搜索,可以找到其他关于这个确切问题的主题。简短的答案是JS不支持它。 :( - aebabis
你能给出一个遇到这个问题的例子吗,比如你想匹配的字符串和期望的返回值。 "aaa" 不同数量的捕获组是造成差异的原因。 - Owen Allen
我只是尝试使用正则表达式实现字符串的explode函数,并希望进一步进行语法分析实验。我通过str.match(/([^ \n\t\(\)]+|\(|\))/g)绕过了这个问题 - 这也将括号视为标记。但我认为这不是问题的解决方案。 - Christoph85LE
2个回答

5
您可能正在寻找以下内容:
var re = /([abc])/g,
    matches = [],
    input = "abc";
while (match = re.exec(input)) matches.push(match[1]);

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

记住,任何匹配组都只会给出最后匹配的模式,而不是所有匹配项。

1
如果你只需要匹配(a)(a)(a),那么这个方法非常好用。但是如果你想匹配(a)(b)*(c),你就必须要切割字符串,这有点不方便。 - aebabis
谢谢!从功能上来说,这就是我想要的。我只是认为它可能是可能的 - 或者会很好 - 如果正则表达式可以为我完成它。但我担心必须手动编码 ;) - Christoph85LE
是的,没错,这是你能得到的最好的。 - anubhava
如果这个答案对您有帮助,请点击我的回答左上角的勾号标记为已接受的答案。 - anubhava
这是我在stackoverflow上的第二个问题,也是第一个真正的对话 :D。我很少需要提问,因为这里有很多好的答案。再次感谢! - Christoph85LE

0

RegExBuddy解释得非常好:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接