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

标签 regex language-agnostic

因此,我需要从以下条目中减去小时,分钟和秒钟:

  • 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或字符串 anchor (^$)。

    编辑:考虑一下,您可以进一步限制它以捕获仅有意义的时间。用
    [0-5]?\d
    

    代替
    \d{1,2}
    

    仅在适当的位置(秒和分钟)捕获0到59之间的值。

    关于regex - 以正则表达式匹配小时/分钟/秒-更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1400297/

    相关文章:

    c++ - 多线程环境下的文档锁定

    ruby - 如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?

    java - 使用正则表达式进行条件替换

    python - pandas 变量的两步正则表达式

    需要用于多行搜索的正则表达式(grep)

    algorithm - 求任意 N 个顶点之间所有路径的图算法

    从原点开始在离散二维网格上迭代向外螺旋的算法

    language-agnostic - 可链接方法的优点和缺点?

    javascript - 查找某个索引后的索引字符

    language-agnostic - 如何动态配置应用程序?