javascript - 如何使用基于字符的正则表达式将值匹配到单独的可选组中?
问题描述
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-
输入的部分也可以忽略,但没有太大区别,无论如何都可以轻松调整。
解决方案
这应该回答你的问题:
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
- 替换函数根据数字和单位组成对象
推荐阅读
- docker - MSBUILD:错误 MSB1009:为 ASP.NET Core API 应用程序构建 docker 文件时项目文件不存在
- sed - 有没有办法在文本文件的分隔符之间添加字符?
- java - 拒绝服务:正则表达式:fortify 指出了一个问题
- python - Django 自定义用户模型添加属性
- android - Room - 如何从选择 String 和 Int 的查询中返回新的自定义类型?
- heroku - 有没有办法在 Hasura graphql 中为整个模式(整个表)设置权限,而不是授予每个表的权限?
- php - Composer 安装 VirtualAlloc() 失败:[0x00000008]
- c++ - 如何在用户给定号码的前面和后面添加一个数字?C++
- python-3.x - 无法导入名称“AsyncIOSchedular”
- android - 如何在 Android Studio 中清除 RequestQueue 缓存?