我需要确保用户的时间戳输入是
(0到无穷大)天
(0至23)小时
(h至59)分钟
之间有空格,所以很好的例子是
但不是
我到目前为止所拥有的是:
^(0|[1-9][0-9]*d)?( [0|[1-5][0-9]*h)?(0| [1-5][0-9]*m)?$
得到:
但不是
这似乎是微不足道的,我是通过几个SO问题来构成的,但没有一个与此完全匹配。
编辑
请注意,我的原始尝试存在一个错误,该错误会导致1-59 小时小时。
答案 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)$
这将匹配:
^
字符串的开头(?:
非捕获组
[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
匹配h
和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
)
关闭非捕获组$
字符串结尾答案 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)