所以我需要从这样的条目中获取小时、分钟和秒:
- 04:43:12
- 9.43.12
- 1:00
- 01.04
- 59
- 09
前两个是小时、分钟和秒。
接下来是分钟和秒。
最后两秒只是几秒钟。
我想出了这个正则表达式,它有效......:
\A(?<hours>\d{1,2})(?::|\.)(?<minutes>\d{1,2})(?::|\.)(?<seconds>\d{1,2})\z|\A(?<minutes>\d{1,2})(?::|\.)(?<seconds>\d{1,2})\z|\A(?<seconds>\d{1,2})\z
但它很丑陋,我想将其重构为不是 3 个不同的表达式(主要是为了学习)。我试过这个:
\A(?:(?<hours>\d{1,2})(?::|\.){0,1})(?:(?<minutes>\d{1,2})(?::|\.){0,1})(?:(?<seconds>\d{1,2}){0,1})\z
但这是行不通的——分和秒有时会被搞砸。我的脑子很痛,我不知道我做错了什么。
我的建议:
(?:(?:(?<hh>\d{1,2})[:.])?(?<mm>\d{1,2})[:.])?(?<ss>\d{1,2})
结构化的:
(?: # group 1 (non-capturing)
(?: # group 2 (non-capturing)
(?<hh>\d{1,2}) # hours
[:.] # delimiter
)? # end group 2, make optional
(?<mm>\d{1,2}) # minutes
[:.] # delimiter
)? # end group 1, make optional
(?<ss>\d{1,2}) # seconds (required)
如果您愿意,您可以将正则表达式包裹在分隔符中 - 例如单词边界\b
或弦锚(^
and $
).
编辑:考虑一下,您可以进一步限制它以仅捕获有意义的时间。使用
[0-5]?\d
代替
\d{1,2}
仅在适当的情况下捕获 0 到 59 之间的值(秒和分钟)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)