我正在尝试对文本框运行正则表达式验证,该文本框将采用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)?
。
答案 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/30
或2/31
与 匹配。
与(?!(?:0?[469]|11)\/31)
类似,可确保使用4/31
,6/31
,9/31
和11/31
。
使用第一个示例((?!0?2\/3[01])
),有0?
这意味着最多一个0
。
仍在同一个例子中,您会看到3[01]
使用[]
确定可以匹配的一组字符,在本例中为字符0
和1
。
使用第二个示例((?!(?: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
相同)或匹配11
,12
或(?:[1-9]|[12]\d|3[01])
同样,1
匹配从9
到1
;或2
或0
后跟9
到10
的号码(基本上是29
到30
);或31
或$
。
要完成,我们会有^
字符
与2/29 i like cookies
相反,这将锚定到字符串的末尾
如果没有这个,^
就会匹配
如果没有On 3/20, we will meet here
,{{1}}也会匹配。
我不是世界上最好的老师,我不是最好的解释 如果你练习,你会发现这开始有意义 有关此主题的任何问题,我可以自由回答。