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)
添加回答
舉報