我有一组格式的日期,我需要将这些日期转换为另一种日期。
输入:<month>/<day>/<year>
输出:<day>/<month>/<year>
- 此外,如果0
只包含一个字符,我需要填写几个月和几天。
我创建了正则表达式以匹配给定的日期格式。然后我想使用String.prototype.replace
修改该日期,并通过将它们作为replace
方法的第二个参数直接传递到模板文字内的函数来修改捕获的组。
我面临的问题是它没有像我期望的那样工作。在某些情况下,函数pad
正确填充日期,在其他情况下它不会。更确切地说,我希望第二个控制台日志为12
,但结果为012
。
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;
有没有人知道该代码有什么问题?
答案 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));