【问题标题】:Javascript - Regex replace number with HH:MMJavascript - 正则表达式用 HH:MM 替换数字
【发布时间】:2022-01-18 23:08:12
【问题描述】:

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

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

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

但现在我正在尝试弄清楚如何将其用于以下情况

94 - 这应该用 23 替换,然后在冒号之后的时间也一样

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

我找到了一个可以做到这一点的正则表达式 ^([0-1]?[0-9]|2[0-3]):[0-5][0-9],但我无法弄清楚如何将它与 .replace 结合起来

【问题讨论】:

  • 为什么是24:12?也许00:12
  • 那么您将不得不在替换中使用一个函数并添加逻辑来更改输出。对于可以做到这一点的字符串输出,您无能为力。
  • 仅插入一个冒号(不是您的整个问题),您可以用冒号替换零宽度匹配(将其视为两个连续字符之间):myString.replace(/(?<=\b\d{2})(?=\d{2}\b)/g, ':')Demo。将光标悬停在链接上正则表达式的每个元素上,以获得对其功能的解释。
  • @WiktorStribiżew 你是对的,忽略了这一点

标签: javascript string time


【解决方案1】:

在您的情况下,我认为没有任何充分的理由使用正则表达式。
只需一个简单的函数即可完成工作。

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}`
}

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 好的,这对我帮助很大。但是我还有一件事,假设用户开始写 25 或 29 甚至 99,我将如何将其替换为 23 最长小时(前两位数),然后在替换后就像您的示例中一样
    • @MePo 您只需在输入中添加一个键侦听器,并在每次用户键入时验证文本。
    【解决方案3】:

    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"));

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 2011-02-03
      • 2010-11-12
      • 2016-09-23
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 2018-12-14
      • 2011-02-24
      相关资源
      最近更新 更多