为什么这个 RegExp 没有按预期工作?

Why doesn't this RegExp work as expected?

我制作了一个 RegExp 来格式化传入的日期字符串,但它并没有像我预期的那样工作。我希望有人能解释为什么不这样做:

var data = [
  "m_2013_01_01",
  "m_2013_02_01",
  "m_2013_03_01",
  "m_2013_04_01"
];

// why aren't these equivalent?
//  expected
console.log(data.map(datum => datum.replace(/^m_(\d+)_(\d+)_(\d+)/g, '--')));
//  ???
console.log(data.map(datum => datum.replace(/^m_(?:(\d+)_?){3}$/g, '--')));

在第一个正则表达式中,您使用了 3 个组:

这就是您可以参考第 1、2 和 3 组的原因。

但是,在第二个正则表达式中,您多次重复使用 1 个组,因此第 2 组和第 3 组不存在且无法引用: