2 回答
TA贡献1836条经验 获得超3个赞
你快到了。你想要的是:
format.replace(/%(H|M|S|MS)\b/g, (_, f) => date[f]);
// date: 1:2:3:4
匹配不同的字符组是通过()使用管道的捕获组完成的|,并且您还只需要在捕获组内匹配的字符(传递给函数的第二个参数)。最后, the\b匹配一个单词边界:你不想%MS被捕获组中的第一个匹配,你只想在the 之后有一个单词边界M的情况下这样做。%M:M
如果你还想有填充零:
format.replace(/%(H|M|S|MS)\b/g, (_, f) => date[f].toString().padStart(2, '0'));
// date: 01:02:03:04
或者,更简单,如果您愿意date稍微修改一下:
const date = {
'%H': '01',
'%M': '02',
'%S': '03',
'%MS': '04',
};
const format = 'date: %H:%M:%S:%MS';
format.replace(/%(H|M|S|MS)\b/g, f => date[f]);
// date: 01:02:03:04
TA贡献1797条经验 获得超4个赞
我可能会看到您的代码至少有 3 个问题:
方括号在 RegExp 中的工作方式与您期望的不同
匹配的子字符串(在捕获组内)是
.replace()
回调的第二个参数你的对象的值
date
是 typeNumber
,所以你会松散0
(例如01
变成1
)
如果解决了以上所有问题,您可能会得到这样的结果:
const date = {
H: 01,
M: 02,
S: 03,
MS: 04,
},
format = 'date: %H:%M:%S:%MS',
result = format.replace(
/%(MS|H|M|S)/g,
(_,m) =>
`${date[m]}`.padStart(2, '0')
)
console.log(result)
添加回答
举报