猿问

如何使用正则表达式替换不同的格式字符串?

我想把字符串"date: %H:%M:%S:%MS"变成"date: 01:02:03:04". 也就是说,用正确的数字替换每个格式说明符。


const date = {

    H: '01',

    M: '02',

    S: '03',

    MS: '04',

}

const format = 'date: %H:%M:%S:%MS';

format.replace(/%[H,M,S,MS]/g, (f) => date[f]); // like this but it's not working

我怎样才能做到这一点 ?


拉风的咖菲猫
浏览 102回答 2
2回答

米脂

你快到了。你想要的是: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

繁星coding

我可能会看到您的代码至少有 3 个问题:方括号在 RegExp 中的工作方式与您期望的不同匹配的子字符串(在捕获组内)是.replace()回调的第二个参数你的对象的值date是 type Number,所以你会松散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)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答