我正在尝试找出正确的正则表达式来检测类似于 2d1h30m10s
的模式,其中任何一个都有效,例如 1h
或 1h30m
或 30m
或 10s
或这些的任意组合。正则表达式是正确的工具吗?
我试图理解它,无论我做什么,我都会从这些不同的测试中得到false
:
/^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('2d1h10m10s')
/^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('10m10s')
/^(0?[1-9]|1[0-2][h])([1-6][0-9][m])([1-6][0-9][s])\d$/.test('10s')
我在这里缺少什么?
最佳答案
您需要将正则表达式的每个部分设为可选,这样您就可以省略该单元。
您需要从其中一个选项中取出[h]
——您匹配12h
,但不匹配01h
。
末尾不应该有 \d
。
您不允许使用单位数的分钟或秒。也不需要 60s 或 60m,因为那是 1m 和 1h。
/^((0?[1-9]|1[0-2])h)?([1-5]?[0-9]m)?([1-5]?[0-9]s)?$/
无需将 h
、m
和 s
放在方括号内,因为它们只是单个字符。
请注意,由于每个单元都是可选的,因此这也将匹配空字符串。您应该与正则表达式分开检查这一点。
关于Javascript - 如何检查正则表达式以确保字符串至少包含一个字母/数字序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54205936/