正则表达式限制数字的上限和下限

时间:2014-12-04 18:30:45

标签: regex

我正在尝试对文本框运行正则表达式验证,该文本框将采用mm / dd格式的输入。我得到了足够的结构部分帮助,^\d{2}/\d{2}?,但是有办法限制最大值和最小值,比如^\d{2}(sth that requires this to be between 0 and 12)/\d{2}(sth that requires this to be between 1 and 31)?

1 个答案:

答案 0 :(得分:4)

这不是用正则表达式完成的!

但是,我做了因为我可以。

这是一个解决方案:

/^(?!0?2\/3[01])(?!(?:0?[469]|11)\/31)(?:\d|1[012])\/(?:[1-9]|[12]\d|3[01])$/

你应该从不使用正则表达式!

根据我的理解,格式为mm/dd(月/日)。

天数为1-31,月份为0-12(OP请求) 这只是评估。

使用否定前瞻,我可以确保(可能的)有效日期。

但严肃地说:小孩,不要在家里试试!


修改

正如OP在评论中所提出的那样,我将在此解释这是如何工作的:

一开始我们有^字符 这会将字符串锚定在开头,而不是从字符串的中间开始匹配。

(?!)开头的所有群组都是否定前瞻。

这样做是为了先检查提前来检查前面的内容是否与模式匹配。

使用(?!0?2\/3[01])可确保2/302/31 匹配。
(?!(?:0?[469]|11)\/31)类似,可确保使用4/316/319/3111/31

使用第一个示例((?!0?2\/3[01])),有0? 这意味着最多一个0

仍在同一个例子中,您会看到3[01] 使用[]确定可以匹配的一组字符,在本例中为字符01

使用第二个示例((?!(?:0?[469]|11)\/31)),您拥有组(?:0?[469]|11)(?:)这样的所有群组都是非捕获群体 这意味着他们会匹配,但不会保存比赛 这对于我们与|一起使用的决策非常有用,or用于匹配模式之前或之后的模式。
实质上,它的工作方式类似于(?:\d|1[012])\/(?:[1-9]|[12]\d|3[01])$运算符。

到目前为止,我们只检查字符串是否是其中一个无效日期 现在,我们将使用(?:\d|1[012])验证日期格式 这部分确保格式正确且在限制范围内 0位匹配9\d之内的任何数字([0-9],与10相同)匹配1112(?:[1-9]|[12]\d|3[01]) 同样,1匹配从91;或20后跟910的号码(基本上是2930);或31$

要完成,我们会有^字符 与2/29 i like cookies相反,这将锚定到字符串的末尾 如果没有这个,^就会匹配 如果没有On 3/20, we will meet here,{{1}}也会匹配。

我不是世界上最好的老师,我不是最好的解释 如果你练习,你会发现这开始有意义 有关此主题的任何问题,我可以自由回答。