Kje*_*sen 7 regex language-agnostic
所以我需要从这些条目中获得数小时,分钟和秒:
前两个是小时,分钟和秒.接下来是分钟和秒.最后两个只是秒.
我想出了这个正则表达式,它有效..:
\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
Run Code Online (Sandbox Code Playgroud)
但它很丑陋,我想重构它不是3种不同的表达方式(大多数只是为了学习).我试过这个:
\A(?:(?<hours>\d{1,2})(?::|\.){0,1})(?:(?<minutes>\d{1,2})(?::|\.){0,1})(?:(?<seconds>\d{1,2}){0,1})\z
Run Code Online (Sandbox Code Playgroud)
但这不起作用 - 分钟和秒钟有时会搞砸.我的大脑受伤了,我无法弄明白,我做错了什么.
Tom*_*lak 10
我的建议:
(?:(?:(?<hh>\d{1,2})[:.])?(?<mm>\d{1,2})[:.])?(?<ss>\d{1,2})
Run Code Online (Sandbox Code Playgroud)
结构化的:
(?: # 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)
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以将正则表达式包装在分隔符中 - 例如单词边界\b或字符串锚点(^和$).
编辑:考虑一下,你可以进一步限制,以捕捉有意义的时间.使用
[0-5]?\d
Run Code Online (Sandbox Code Playgroud)
代替
\d{1,2}
Run Code Online (Sandbox Code Playgroud)
在适当的情况下(秒和分钟)捕获0到59之间的值.
我还没有测试过,但它应该工作:
^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$
Run Code Online (Sandbox Code Playgroud)
编辑:
现在我测试了它并验证它是否有效.:)