在正则表达式中匹配小时/分钟/秒 - 更好的方法?

Kje*_*sen 7 regex language-agnostic

所以我需要从这些条目中获得数小时,分钟和秒:

  • 4点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
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之间的值.


Guf*_*ffa 5

我还没有测试过,但它应该工作:

^(?:(?:(?<hours>\d\d?)[:\.])?(?<minutes>\d\d?)[:\.])?(?<seconds>\d\d?)$
Run Code Online (Sandbox Code Playgroud)

编辑:
现在我测试了它并验证它是否有效.:)