【问题标题】:Making regex for preg_match greedy to only accept certain values?使 preg_match 的正则表达式贪婪地只接受某些值?
【发布时间】:2018-08-20 15:28:57
【问题描述】:

我有一个 CSV 文件,其中包含一个表示时间/日期的字符串条目,如下所示:

20190816T16:10:10

我已经为 preg_match 创建了以下正则表达式,但希望小时/分钟和秒只允许某些数字(例如小时将是 24 小时制,因此只接受 00-23,而分钟和秒只接受 00- 59)

/\d{8}[A-Z]\d{2}:\d{2}:\d{2}/

谁能建议如何更改它以确保此正则表达式与我试图实现的结构相匹配?

【问题讨论】:

  • 你愿意和leap second打交道吗?
  • @toto 你到底是什么意思?
  • 秒数可以是60,比如December 31, 2005 23:59:60 UTC

标签: php regex date datetime preg-match


【解决方案1】:

您需要修改模式以匹配构成这些范围的基础字符串:

/\d{8}[A-Z](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/

Demo

【讨论】:

  • [0-9] 可以只是 \d?
  • @codisfy 是的,它可以,但我认为[0-9] 在这种情况下读起来更好,因为几乎在其他任何地方都使用了字符类。
  • 有道理,我只是在考虑简洁。
【解决方案2】:

这个正则表达式应该匹配你的结构:

\d{8}[A-Z]([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]

【讨论】:

    【解决方案3】:

    您可以使用范围(例如:[0-9]),并在非捕获组中使用小时(分钟和秒很容易匹配):

    //            00 to 23       00 to 59
    /\d{8}[A-Z](?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多