首页 > 解决方案 > 如何使用基于字符的正则表达式将值匹配到单独的可选组中?

问题描述

3个输入示例:

"13-4h50m2s"
"13-4h2s"
"13-50m"

首选代码:

const [hours = 0, minutes = 0, seconds = 0] = input.match(some_regexp)

3 个示例的所需输出 {hours,minutes,seconds}

{hours: 4, minutes: 50, seconds: 2}
{hours: 4, minutes: 0,  seconds: 2}
{hours: 0, minutes: 50, seconds: 0}

我试过的正则表达式:/(\d+)?[a-z](\d+)?[a-z]?(\d+)?[a-z]?/. 但是第二个例子不起作用。

编辑:可以预期输入以正确的顺序(h,m,s)排序。并且这些值是存储为字符串还是数字都没有关系。

编辑2:抱歉更新晚了,实际上13-输入的部分也可以忽略,但没有太大区别,无论如何都可以轻松调整。

标签: javascriptregex

解决方案


这应该回答你的问题:

const labelMap = { h: 'hours', m: 'minutes', s: 'seconds' };
[
  "13-4h50m2s",
  "13-2s4h",
  "13-50m"
].forEach((str) => {
  let obj = { hours: 0, minutes: 0, seconds: 0 };
  str.replace(/(\d+)([hms])/g, (m, p1, p2) => {
    obj[labelMap[p2]] = parseInt(p1, 10);
  });
  console.log(JSON.stringify(obj));
});

输出:

{"hours":4,"minutes":50,"seconds":2}
{"hours":4,"minutes":0,"seconds":2}
{"hours":0,"minutes":50,"seconds":0}

笔记:

  • 从您的labelMap输入单元映射到所需的输出对象键
  • 使用没有返回的字符串替换,它只是用来迭代我们想要的模式:/(\d+)([hms])/g
  • 替换函数根据数字和单位组成对象

推荐阅读