因此,我需要从以下条目中减去小时,分钟和秒钟:
前两个是小时,分钟和秒。
旁边是分钟和秒。
最后两个只是几秒钟。
我想出了这个正则表达式,可以用..:
\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
或字符串 anchor (^
和$
)。编辑:考虑一下,您可以进一步限制它以捕获仅有意义的时间。用
[0-5]?\d
代替
\d{1,2}
仅在适当的位置(秒和分钟)捕获0到59之间的值。
关于regex - 以正则表达式匹配小时/分钟/秒-更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400297/