You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript正则替换子串未达预期,如何标准化时间meridiems格式?

时间格式中带点Meridiem的转换方案

需求

将带点的上午/下午标识(如'2:0 a. m.'、'3:0 p. m.')转换为无点格式('2:0 am'、'3:0 pm'),同时兼容已有的无点格式('2:0 am'、'3:0 pm')。

你之前正则的问题分析

  1. 第一个正则 /.*?\s)([ampAMP]*?)/
    因为[ampAMP]*?是非贪婪匹配,会优先匹配0次字符,替换操作等于没做,结果和原字符串一致。
  2. 第二个正则 /.*?\s)([ampAMP]).*?([ampAMP])/
    替换时只保留了时间部分($1),但原字符串中a. m.里的.没有被匹配覆盖,剩下的.留在结果里,导致输出'2:0 .'。
  3. 第三个正则虽能生效,但写法冗余,没利用正则的简洁性。

最优解决方案

方案1:拆分后清理(易读性优先)

通过拆分时间和Meridiem部分,单独清理无效字符后拼接:

function formatTimeMeridiem(timeStr) {
  // 按空格拆分,只取前两部分(时间+标识)
  const [timePart, meridiemPart] = timeStr.split(/\s+/, 2);
  // 过滤掉标识中除a/A/m/M/p/P外的所有字符
  const cleanMeridiem = meridiemPart.replace(/[^aAmMpP]/g, '');
  // 拼接成目标格式
  return `${timePart} ${cleanMeridiem}`;
}

// 测试用例
console.log(formatTimeMeridiem('2:0 a. m.')); // 输出 '2:0 am'
console.log(formatTimeMeridiem('3:0 p. m.')); // 输出 '3:0 pm'
console.log(formatTimeMeridiem('2:0 am'));     // 输出 '2:0 am'
console.log(formatTimeMeridiem('3:0 pm'));     // 输出 '3:0 pm'

方案2:正则替换函数(简洁性优先)

用正则匹配第一个空格后的所有内容,替换时直接清理无效字符:

const formatted1 = '2:0 a. m.'.replace(/\s+.*/, match => ` ${match.replace(/[^aAmMpP]/g, '')}`);
const formatted2 = '3:0 p. m.'.replace(/\s+.*/, match => ` ${match.replace(/[^aAmMpP]/g, '')}`);

console.log(formatted1); // '2:0 am'
console.log(formatted2); // '3:0 pm'

方案3:精准正则匹配(性能优先)

针对已知带点格式,写精准匹配的正则直接替换:

const regex = /^(\d+:\d+)\s+([aApP])\.?\s*([mM])\.?$/;
console.log('2:0 a. m.'.replace(regex, '$1 $2$3')); // '2:0 am'
console.log('3:0 p. m.'.replace(regex, '$1 $2$3')); // '3:0 pm'
console.log('2:0 am'.replace(regex, '$1 $2$3'));     // '2:0 am'

内容的提问来源于stack exchange,提问作者Sampgun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:31:15