我编写了以下正则表达式,以便在命令行中匹配人类可读的时间:
^(?:(?:(?:(\d+)d\s*)?(\d+)h\s*)?(\d+)m\s*)?(\d+)s$
使用非捕获字符串,此正则表达式匹配"人类可读"时间同样适用于以下格式:
1d 2h 3m 4s
1h 2m 3s
1m 2s
1s
...和...
1d2h3m4s
1h2m3s
1m2s
1s
在此正则表达式中,如果我包含minutes
值,我还必须包含seconds
值。即,我不能简单地提供15m
或1d3m
,我必须提供15m0s
或1d0h3m0s
。
是否可以扩展正则表达式以匹配后两个用例?怎么样? 请注意:我不一定要寻找插入式解决方案,但我们会非常感谢正确方向的指针。
只是我做了一段时间的简短更新 - 这是Python中的正则表达式。
答案 0 :(得分:2)
您可以使用此模式:
\A(?=\S)(?:\d+d)?(?:\h*\d+h)?(?:\h*\d+m)?(?:\h*\d+s)?\z
方法是使所有元素都是可选的。开头的前瞻确保至少有一个不是空格的角色。 (换句话说,它确保至少有一个元素)
答案 1 :(得分:2)
相反,保持正则表达式并尝试调整它我会建议大大简化你的正则表达式:
/ *(\d+)([dhms])/gm
正如您所看到的,它匹配您当前和建议的所有字符串。然后,您可以在代码中对两个捕获的组进行后处理。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以使用嵌套组:
/^(?:(?:(?:(\d+)d\s*)?(\d+)h\s*)?(\d+)m\s*)?(\d+)s$/g
d
,h
,m
和s
的值分别为1,2,3和4组。