捕获模板文字内的正则表达式组作为函数参数

时间:2018-04-18 21:07:09

标签: javascript regex ecmascript-6

我有一组格式的日期,我需要将这些日期转换为另一种日期。

输入:<month>/<day>/<year>

输出:<day>/<month>/<year> - 此外,如果0只包含一个字符,我需要填写几个月和几天。

我创建了正则表达式以匹配给定的日期格式。然后我想使用String.prototype.replace修改该日期,并通过将它们作为replace方法的第二个参数直接传递到模板文字内的函数来修改捕获的组。

我面临的问题是它没有像我期望的那样工作。在某些情况下,函数pad正确填充日期,在其他情况下它不会。更确切地说,我希望第二个控制台日志为12,但结果为012

&#13;
&#13;
const pad = date => date.length === 2 ? date : '0' + date;

const normalizeDate = date => {
  const regex = /(?<month>\d{1,2})\/(?<day>\d{1,2})\/(?<year>\d{4})/;

  // pad string of length 1 works correctly (expected '01'/ result '01')
  console.log(date.replace(regex, `${pad('$<month>')}`));

  // pad sting of length 2 doesn't (expected '12' / result '012')
  console.log(date.replace(regex, `${pad('$<day>')}`));

  // test shows that <day> = 12
  console.log(date.replace(regex, `$<day>`));

  // padding 12 directly works (expected '12' / result '12') 
  console.log(pad('12'));

  return date.replace(regex, `${pad('$<month>')}-${pad('$<day>')}-$<year>`);
}

const date = '1/12/2014';
normalizeDate(date);
&#13;
&#13;
&#13;

有没有人知道该代码有什么问题?

1 个答案:

答案 0 :(得分:2)

$<day>命名的反向引用只能用于字符串替换模式。由于您需要修改捕获,因此需要使用匿名方法:

.replace(regex, (_,month,day,year) => `${pad(month)}`)

此处,在括号中,您必须为整个匹配和捕获组定义变量。所以,基本上,你不需要新的ECMAScript 2018正则表达式增强,因为你也可以在这里使用常规编号的捕获组。

请参阅更新的演示:

const pad = date => date.length === 2 ? date : '0' + date;

const normalizeDate = date => {
  const regex = /(?<month>\d{1,2})\/(?<day>\d{1,2})\/(?<year>\d{4})/;

  // pad string of length 1 works correctly (expected '01'/ result '01')
  console.log(date.replace(regex, (_,month,day,year) => pad(month)));

  // pad sting of length 2 doesn't (expected '12' / result '012')
  console.log(date.replace(regex, (_,month,day,year) => pad(day)));

  // test shows that <day> = 12
  console.log(date.replace(regex, "$<day>"));

  // padding 12 directly works (expected '12' / result '12') 
  console.log(pad('12'));

  return date.replace(regex, (_,month,day,year) => `${pad(month)}-${pad(day)}-${year}`);
}

const date = '1/12/2014';
console.log(normalizeDate(date));