【问题标题】:Why doesn't this RegExp work as expected?为什么这个 RegExp 不能按预期工作?
【发布时间】:2016-11-11 13:09:29
【问题描述】:

我创建了一个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, '$1-$2-$3')));
//  ???
console.log(data.map(datum => datum.replace(/^m_(?:(\d+)_?){3}$/g, '$1-$2-$3')));

【问题讨论】:

  • 如果你真的想以任何方式使用量词,你永远不应该在捕获组上使用量词,因为实际上只存储了该组的最后一次出现。

标签: javascript regex replace capturing-group


【解决方案1】:

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

这就是为什么您可以引用组 1、2 和 3。

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

【讨论】:

  • 哇!您从哪里获得这些控制流?
  • @FedericoPiazza 实际上 Debuggex 有一个专门针对 Stack Overflow 的共享功能,它也链接到 Debuggex。
  • @Xufox,是的,我不想粘贴完整的调试共享功能。该图像只是用来回答问题的说明性
  • @PatrickRoberts,还...请记住,您可以使用滑块逐步调试正则表达式!Regular expression visualization
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2015-06-09
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多