【问题标题】:Regular expression for matching HH:MM time format匹配 HH:MM 时间格式的正则表达式
【发布时间】:2011-09-24 03:14:43
【问题描述】:

我想要一个正则表达式来匹配 HH:MM 格式的时间。这就是我所拥有的,并且有效:

^[0-2][0-3]:[0-5][0-9]$

这匹配从 00:00 到 23:59 的所有内容。

但是,我想更改它,以便 0:00 和 1:00 等也匹配,以及 00:00 和 01:30。即使最左边的数字可选,以匹配 HH:MM 和 H:MM。

任何想法如何做出改变?我需要它在 javascript 和 php 中工作。

【问题讨论】:

  • 实际上您的原始正则表达式不会匹配整个范围的有效时间值,例如17:00
  • 这行得通:^(?:[01]?\d|2[0-3])(?::[0-5]\d){1,2}$ 并且还可以捕获您不匹配的时间值。

标签: regex


【解决方案1】:

时间的正则表达式

  • HH:MM 12 小时格式,可选前导 0

      /^(0?[1-9]|1[0-2]):[0-5][0-9]$/
    
  • HH:MM 12 小时格式,可选前导 0,强制性子午线 (AM/PM)

      /((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))/
    
  • HH:MM 24 小时,前导 0

     /^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
    
  • HH:MM 24 小时格式,可选前导 0

     /^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/
    
  • HH:MM:SS 24 小时格式,前导 0

     /(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)/
    

Reference and Demo

【讨论】:

  • 任何原因 HH:MM 24-hour withleading 0 不是 ^([0-2][0-3]|[0-1][0-9]):[0-5][0-9]+$?
  • 因为答案中的正则表达式效果很好。你评论的那个也有效。随意使用它们中的任何一个。 :)
  • 对于使用上述正则表达式匹配 12 小时(使用 am/pm)字符串的人,请记住,针对正则表达式测试“13:00 PM”将返回 true(某些值),因为“3: 00 PM" 字符串中的部分是有效的。我通过使用以下 if 语句解决了这个问题 let res = value.match(regex); if (res && res[0] === value) doSomething();
  • 第一个示例中的尾随 \d 是否属于那里?似乎只能匹配 3 位数的分钟数。
  • @dantebarba 我已经在 regex101.com 上尝试过了,它可以工作。结果取决于初始字符串。如果您在较长的字符串中搜索并希望在中间某处提取有效小时,请尝试([0-2][0-3]|[0-1][0-9]):([0-5][0-9]{1})。我想我使用了以前的正则表达式来验证输入框,这就是为什么我使用^(开头)和$(结尾)。我强烈建议使用正则表达式来尝试表达式。
【解决方案2】:

您原来的正则表达式有缺陷:例如,它与 04:00 不匹配。

这可能会更好:

^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$

【讨论】:

  • 此正则表达式用于时间,不带前导零。带前导零的时间正则表达式是^([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
  • @SergO 请仔细阅读他的回答。他的答案是前导零和没有前导零。
  • 稍微短一点的形式是^(?:\d|[01]\d|2[0-3]):[0-5]\d$
  • 在 C# 中也能很好地工作。
  • @SergO 不应该是 ^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$ ?
【解决方案3】:

以上都不适合我。 最后我用了:

^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$ (js engine)

逻辑:

第一个数字(小时)是: 一个介于 0 和 19 之间的数字 --> [0-1]?[0-9](允许单个数字)

一个介于 20 - 23 之间的数字 --> 2[0-3]

第二个数字(分钟)始终是 00 到 59 之间的数字 --> [0-5][0-9](不允许单个数字)

【讨论】:

  • 你不需要第一个方括号中的破折号,[01] 也可以;)
  • 这里的答案修改为只接受 12 小时时间(包括可选的前导零):^(0?[1-9]|1[0-2]):[0-5][0-9]$
  • ^([0-1][0-9]|2[0-3]):[0-5][0-9]$ 强制使用前导零
【解决方案4】:

说明

hours:minutes 与:

  • 强制am|pmAM|PM
  • 强制前导零 05:01 而不是 5:1
  • 0112 的小时数
  • 小时不接受00,如00:16 am
  • 0059 的分钟数

01:16 am
01:16 AM
01:16 ❌(错过am|pm
01:16 Am❌(am 必须全部低于或大写)
1:16 am ❌(小时数前导零)
00:16 ❌(无效小时值00

正则表达式

匹配单个匹配项:
^(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)$

匹配多次出现:
删除^$
(0[1-9]|1[0-2]):([0-5][0-9]) ((a|p)m|(A|P)M)

【讨论】:

    【解决方案5】:

    你可以24小时使用这个,秒是可选的

    ^([0-1]?[0-9]|[2][0-3]):([0-5][0-9])(:[0-5][0-9])?$
    

    【讨论】:

      【解决方案6】:

      最好的情况是 HH:MM 不承担任何风险。

      ^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$
      

      【讨论】:

      • 可以缩短为^([0-1]\d|2[0-3]):[0-5]\d$吗?
      【解决方案7】:

      以上答案都不适合我,以下一个有效。

      "[0-9]{2}:[0-9]{2}"
      

      【讨论】:

      • 这允许像“31:123”这样的无效时间
      【解决方案8】:

      令人惊讶的是,我发现实际上所有这些都不能完全涵盖它,因为它们不适用于 0:0 的较短格式午夜,有些也不适用于 00:00,我使用并测试了以下:

      ^([0-9]|0[0-9]|1?[0-9]|2[0-3]):[0-5]?[0-9]$
      

      【讨论】:

        【解决方案9】:

        正如你问的最左边可选的,我也做了最左边和最右边的可选,检查一下

        ^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]?$
        

        匹配

        0:0 
        00:00
        00:0 
        0:00
        23:59
        01:00
        00:59
        

        直播链接可用here

        【讨论】:

          【解决方案10】:

          我的是:

          ^(1?[0-9]|2[0-3]):[0-5][0-9]$

          这要短得多

          用几个例子测试过

          匹配:

          • 00:00
          • 7:43
          • 07:43
          • 19:00
          • 18:23

          并且不匹配任何无效实例,例如 25:76 等 ...

          【讨论】:

          • 09:30 不匹配
          • 您自己的示例 00:00 和 07:43 不匹配。
          【解决方案11】:

          声明

          private static final String TIME24HOURS_PATTERN = "([01]?[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]";
          
          public boolean validate(final String time) {
              pattern = Pattern.compile(TIME24HOURS_PATTERN);
              matcher = pattern.matcher(time);
              return matcher.matches();
          }
          

          当字符串与正则表达式匹配时,此方法返回“true”。

          【讨论】:

            【解决方案12】:

            您可以使用以下正则表达式:

            ^[0-2]?[0-3]:[0-5][0-9]$
            

            我所做的唯一修改是最左边的数字是可选的。正则表达式的其余部分相同。

            【讨论】:

              【解决方案13】:

              检查我构建的这个masterfull timestamp detector 正则表达式,以查找用户指定的时间戳,它将获取的示例包括但绝对不限于;

              8:30-9:40
              09:40-09 : 50
              09 : 40-09 : 50
              09:40 - 09 : 50
              08:00to05:00
              08 : 00to05 : 00
              08:00 to 05:00
              8am-09pm
              08h00 till 17h00
              8pm-5am
              08h00,21h00
              06pm untill 9am
              

              它还会拾取更多,只要时间包括数字

              【讨论】:

              • RegExr requires a modern browser. Please update your browser to the latest version and try again. ...我什至看不到它... :-/
              【解决方案14】:

              你可以使用这个正则表达式:

              ^(2[0-3]|[01]?[0-9]):([1-5]{1}[0-9])$
              

              如果要排除00:00,可以使用这个表达式

              ^(2[0-3]|[01]?[0-9]):(0[1-9]{1}|[1-5]{1}[0-9])$
              

              第二个表达式是更好的选择,因为有效时间是 00:01 到 00:59 或 0:01 到 23:59。您可以根据需要使用其中任何一种。 Regex101 link

              【讨论】:

              • 第一个表达式不接受 00: 05 。不过谢谢。引导我找到我正在寻找的验证。
              【解决方案15】:

              您可以使用以下正则表达式:

              ^[0-1][0-9]:[0-5][0-9]$|^[2][0-3]:[0-5][0-9]$|^[2][3]:[0][0]$
              

              【讨论】:

                【解决方案16】:

                对上面的Manish M Demblani's 贡献稍作修改 处理凌晨 4 点 (我删除了 seconds 部分,因为我的应用程序中不需要它)

                ^(([0-1]{0,1}[0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[1-9]|1[0-2])(:|\.)[0-5][0-9]( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|\.)[0-5][0-9]))$
                

                手柄: 凌晨 4 点 凌晨 4 点 4:00 早上4:00 4:00 PM 凌晨 4.30 等等。

                【讨论】:

                • AM|am|aM|Am|PM|pm|pM|Pm = [AaPp][Mm]
                【解决方案17】:

                以下正则表达式将有助于验证 hh:mm 格式

                ^([0-1][0-9]|2[0-3]):[0-5][0-9]$
                

                【讨论】:

                  【解决方案18】:

                  您的代码将无法正常工作,因为它不适用于 01:00 类型格式。可以如下修改。

                  pattern =r"^(0?[1-9]|1[0-2]):[0-5][0-9]$"
                  

                  为了不那么复杂,我们可以使用一个变量来定义我们的工作时间限制。此外,我们可以添加子午线以获得更准确的结果。

                  hours_limit = 12 
                  pattern = r"^[1-hours_limit]:[0-5][0-9]\s?[AaPp][Mm]$"
                  print(re.search(pattern, "2:59 pm"))
                  

                  【讨论】:

                    【解决方案19】:

                    要验证 24 小时 时间,请使用:

                    ^([0-1]?[0-9]|2?[0-3]|[0-9])[:\-\/]([0-5][0-9]|[0-9])$
                    

                    这接受:

                    22:10
                    2:10
                    2/1
                    ...
                    

                    但不接受:

                    25:12
                    12:61
                    ...
                    

                    【讨论】:

                      【解决方案20】:

                      你可以试试下面的

                      ^\d{1,2}([:.]?\d{1,2})?([ ]?[a|p]m)?$
                      

                      它可以检测以下模式:

                      2300 
                      23:00 
                      4 am 
                      4am 
                      4pm 
                      4 pm
                      04:30pm 
                      04:30 pm 
                      4:30pm 
                      4:30 pm
                      04.30pm
                      04.30 pm
                      4.30pm
                      4.30 pm
                      23:59 
                      0000 
                      00:00
                      

                      【讨论】:

                        【解决方案21】:

                        试试下面的

                        ^([0-2][0-3]:[0-5][0-9])|(0?[0-9]:[0-5][0-9])$
                        

                        注意:我假设是 javascript 正则表达式引擎。如果与此不同,请告诉我。

                        【讨论】:

                          猜你喜欢
                          • 2023-03-18
                          • 1970-01-01
                          • 2010-11-14
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-05-31
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多