Javascript - 正则表达式用 HH:MM 替换数字

Javascript - Regex replace number with HH:MM

我正在尝试用时间格式替换 4 个数字。例如,如果用户输入 1234 将替换为 12:34

我发现这个正则表达式可以完成这项工作

let myString = "1234";
myString.replace(/\b(\d{2})(\d{2})/g, ':')

但现在我想弄清楚如何在

这样的情况下使用它

94 - 这应该替换为 23 然后它在冒号后的时间做同样的事情

01:74 - 这应该替换为 01:59

我找到了一个正则表达式 ^([0-1]?[0-9]|2[0-3]):[0-5][0-9],但我不知道如何将它与 .replace

结合起来

有一个 replace 的重载,它接受一个函数,您可以使用该函数来执行您需要的任何逻辑,例如:

let myString = "1234";

function formatTime(input){
  return input.replace(/\b(\d{2})(\d{2})/, (_,hh,mm) => {
    return `${Math.min(hh,24)}:${Math.min(mm,59)}`
  })
}

console.log(formatTime("1234"));
console.log(formatTime("3412"));
console.log(formatTime("0174"));

您需要匹配第一对和第二对数字,然后将它们绑定到最大值。获得有界值后,您可以填充数字并用冒号连接它们。

const toTimeString = (value) => {
  const
    [, hours, minutes] = value.match(/^(\d{2})(\d{2})$/),
    hour = `${Math.min(+hours, 24)}`.padStart(2, '0'),
    minute = `${Math.min(+minutes, 59)}`.padStart(2, '0');
  return `${hour}:${minute}`;
};

console.log(toTimeString('0174')); // 01:59
console.log(toTimeString('3412')); // 24:12

现在,这是一个替换示例:

const minPad = (value, min) => `${Math.min(value, min)}`.padStart(2, '0');

const toTimeString = (value) =>
  value.replace(/\b(\d{2})(\d{2})\b/g, (match, hours, minutes) =>
    `${minPad(hours, 24)}:${minPad(minutes, 59)}`);

console.log(toTimeString('0174 3412')); // 01:59 24:12

我认为没有任何理由在您的案例中使用正则表达式。
只需一个简单的功能即可完成工作。

function transformTextToHHMMTimeFormat(text) {
  const firstNumber = Number(text.slice(0, 2))
  const secondNumber = Number(text.slice(2, 4))
  const hour = Math.min(firstNumber, 24)
  const minute = Math.min(secondNumber, 59)

  return `${hour}:${minute}`
}