【问题标题】:How do you match 12 hour time hh:mm in a regex?如何在正则表达式中匹配 12 小时时间 hh:mm?
【发布时间】:2010-11-14 11:55:08
【问题描述】:

如何在正则表达式中匹配 12 小时时间 - 换句话说,匹配 12:30 但不匹配 14:74? 谢谢!

【问题讨论】:

  • 我试过这个:(1?[0-9]):([0-9]{2}) 但匹配 14:74!

标签: php regex datetime time


【解决方案1】:

这应该可行:

([1-9]|1[012]):[0-5][0-9]

【讨论】:

  • 请注意,这个匹配“13:00”中的“3:00”。
  • 以上对于“13:00”仍然失败(通过匹配“3:00”),并且不匹配“00:00”。
  • ([1-9]|1[012]):[0-5][0-9] -- 只是为了踢球。
  • @tvanfosson 我的想法完全正确;)
  • @Brian 我会投票给 \b 或向后看 (?
【解决方案2】:

这是一个问题示例,其中“嘿,我知道,我将使用正则表达式!”是错误的解决方案。您可以使用正则表达式检查您的输入格式是否为 digit-digit-colon-digit-digit,然后使用编程逻辑确保值在您期望的范围内。例如:

/(\d\d?):(\d\d)/

if ($1 >= 1 && $1 <= 12 && $2 < 60) {
    // result is valid 12-hour time
}

这比您在此处的其他答案中看到的一些混淆的正则表达式示例更容易阅读和理解。

【讨论】:

  • 或者这是一个示例,您正在填写需要正则表达式的内容...
【解决方案3】:
^(00|0[0-9]|1[012]):[0-5][0-9] ?((a|p)m|(A|P)M)$

^ - 匹配字符串的开头。

(00|0[0-9]|1[012]) - 最多 12 位的任意两位数。需要两位数。

: - 匹配冒号

[0-5][0-9] - 匹配从 00 到 59 的任何两位数。

? - 匹配空格零次或一次。

((a|p)m|(A|P)M) - 匹配上午或下午,不区分大小写。

$ - 匹配字符串的结尾。

【讨论】:

    【解决方案4】:

    像这样:((?:1[0-2]|0\d)\:(?:[0-5]\d)) 如果你想在小时内领先 0,((?:1[0-2]|\d)\:(?:[0-5]\d)) 如果你不想,((?:1[0-2]|0?\d)\:(?:[0-5]\d)) 如果你不在乎。

    【讨论】:

    • 那将强制使用前导 0,不是吗?例如匹配 05:02 但不匹配 5:02?
    • 修正了:你想要,你不想要或者你不在乎 :)
    【解决方案5】:

    为什么是正则表达式?你可以这样做将简单的整数检查

    $str = "12:74";
    list($h , $m ) = explode(":",$str);
    if ( ($h <=12 && $h >=0  ) && ($m <=59 && $m >=0) ) {
        print "Time Ok.";
    }else{
        print "Time not ok";
    }
    

    【讨论】:

    • 是的,但是如果 $str 等于 "foozah",它会破坏你的脚本(因为没有索引 1)。另外,如果$str 等于"foo:zah",您的脚本会说它 一个有效时间,但我认为不是这样。
    【解决方案6】:

    我相信上述方法至少在一种方式上失败了,尤其是对于诸如“13:00”之类的字符串(在这种情况下,Keith 匹配“3:00”)。

    这个问题应该和其他提出的问题一样处理。

    ([01][0-2]|(?<!1)[0-9]):([0-5][0-9])
    

    【讨论】:

      【解决方案7】:
      (0?\d|1[0-2]):([0-5]\d)
      

      这将匹配从 0:00 到 12:59 的所有内容。顺便说一句,那是13个小时。如果您不想匹配 0:00 - 0:59,请尝试以下操作:

      ([1-9]|1[0-2]):([0-5]\d)
      

      【讨论】:

        【解决方案8】:

        你可以用这个:

        /((?:1[0-2])|(?:0?[0-9])):([0-5][0-9]) ?([ap]m)/
        
        /1 => hour
        /2 => minute
        /3 => am/pm
        

        【讨论】:

          【解决方案9】:

          以下匹配 24 小时制(即 00:00 - 23:59)00:00 到 12:59 之间的填充时间和非填充时间。

          (?:(?<!\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9]
          

          匹配:

          • 00:00
          • 00:58
          • 01:34
          • 1:34
          • 8:35
          • 12:23
          • 12:59

          不匹配:

          • 13:00
          • 13:23
          • 14:45
          • 23:59

          【讨论】:

            【解决方案10】:
            ^(?:(?:1?(?:[0-2]))|[1-9]):[0-5][0-9]
            

            【讨论】:

              【解决方案11】:

              这是一个包含上午和下午验证的 12 小时模式。

              TIME12HOURSAMPM_PATTERN = "^(?:(?&lt;!\\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] ?((a|p)m|(A|P)M)$";

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-06-10
                • 2013-08-06
                • 1970-01-01
                相关资源
                最近更新 更多