正则表达式将天小时分钟与空格匹配

时间:2019-03-18 17:17:48

标签: regex

我需要确保用户的时间戳输入是
(0到无穷大)天 (0至23)小时 (h至59)分钟

之间有空格,所以很好的例子是

  • 22h 40m
  • 2d 20m
  • 1d

但不是

  • 0d
  • 2d22h20m

我到目前为止所拥有的是:

^(0|[1-9][0-9]*d)?( [0|[1-5][0-9]*h)?(0| [1-5][0-9]*m)?$

得到:

  • 22d 3h 40m
  • 2d 40m

但不是

  • 40m
  • 40h

这似乎是微不足道的,我是通过几个SO问题来构成的,但没有一个与此完全匹配。

编辑
请注意,我的原始尝试存在一个错误,该错误会导致1-59 小时小时。

2 个答案:

答案 0 :(得分:1)

这很冗长,但是一个选择可能是使用交替,并使用d,h和m的模式列出所有允许的可能性。

您可以使用(d h m)或(d h)或(d m)或(h m)或(d)或(h)或(m)匹配:

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

regex101 demo

这将匹配:

  • ^字符串的开头
  • (?:非捕获组
    • [1-9][0-9]*d (?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m全部匹配
    • |
    • [1-9][0-9]*d匹配d
    • (?:非捕获组
      • (?:2[0-3]|1[0-9]|[1-9])h匹配h
      • |
      • (?:[1-5][0-9]|[1-9])m匹配m
    • )关闭非捕获组
    • |
    • (?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m匹配hm
    • |
    • [1-9][0-9]*d匹配d
    • |
    • (?:2[0-3]|1[0-9]|[1-9])h匹配h
    • |
    • (?:[1-5][0-9]|[1-9])m马赫m
  • )关闭非捕获组
  • $字符串结尾

答案 1 :(得分:0)

编辑 到目前为止,唯一的建议实际上是列出所有可能性。因此,我将在这里进行操作。.请注意,我最初的尝试有一个错误,允许1-59个小时。 regex101

^((([1-9][0-9])d (2[0-3]|1[0-9]|[1-9])h ([1-5][0-9]|[1-9])m)|(([1-9][0-9])d (2[0-3]|1[0-9]|[1-9])h)|(([1-9][0-9])d ([1-5][0-9]|[1-9])m)|((2[0-3]|1[0-9]|[1-9])h ([1-5][0-9]|[1-9])m)|([1-9][0-9])d|(2[0-3]|1[0-9]|[1-9])h|([1-5][0-9]|[1-9])m)$

含义:(d h m)或(d h)或(d m)或(h m)或(d)或(h)或(m)