Regex to match time

北城以北 提交于 2021-02-05 09:44:38

问题


I want my users to be able to enter a time form. If more info necessary, users use this to express how much time is needed to complete a task, and it will be saved in a database if filled.

here is what I have:

/^$|^([0-1]?[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?$/

It matches an empty form or 01:30 and 01:30:00 formatted times. I really won't need the seconds as every task takes a minute at least, but I tried removing it and it just crashed my code and removed support for empty string.. I really don't understand regex at all.

What I'd like, is for it to also match simple minutes and simple hours, like for instance 3:30, 3:00, 5. Is this possible? It would greatly improve the user experience and limit waste typing. But I'd like to keep the zero optional in case some users find it natural to type it.


回答1:


I think the following pattern does what you want:

p="((([01]?\d)|(2[0-4])):)?([0-5]\d)?(:[0-5]\d)?"

The first part:

(([01]?\d)|(2[0-3])):)?

is an optional group which deals with hours in format 00-24.

The second part:

([0-5]\d)?

is an optional group which deals with minutes if hours or seconds are present in your expression. The group also deals with expressions containing only minutes or only hours.

The third part:

(:[0-5]\d)?

is an optional group dealing with seconds.

The following samples show the pattern at work:

In [180]: re.match(p,'14:25:30').string
Out[180]: '14:25:30'

In [182]: re.match(p,'2:34:05').string
Out[182]: '2:34:05'

In [184]: re.match(p,'02:34').string
Out[184]: '02:34'

In [186]: re.match(p,'59:59').string
Out[186]: '59:59'

In [188]: re.match(p,'59').string
Out[188]: '59'

In [189]: re.match(p,'').string
Out[189]: ''

As every group is optional the pattern matches also the empty string. I've tested it with Python but I think it will work with other languages too with minimal changes.



来源:https://stackoverflow.com/questions/13745027/regex-to-match-time

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!