2014-12-04 62 views
1

我试图运行一个文本框,将格式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)?正则表达式限制数字的上限和下限

+3

这实际上是试图在一个方孔中装上一个圆钉。 – 2014-12-04 18:32:39

+4

正则表达式不能以你想要的方式验证数字 – Dalorzo 2014-12-04 18:32:57

+2

即使正则表达式是可能的,但它会允许'02/30'或'09/31'等 – anubhava 2014-12-04 18:33:55

回答

4

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

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

这里是一个解决方案:

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

你应该NEVER使用正则表达式这个!

据我所知,格式是mm/dd(月/天)。

天数在1-31之间,月份从0-12(OP的要求)。
这只是评估。

使用负向预览,我可以确保(可能)有效的日期。

但严重:孩子们,不要在家里试试!


编辑:

如要求通过在赞扬OP,在这里我将解释如何工作的:

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

(?!)开头的所有组都是负向预测。

这是什么做的是,它会采取偷看提前检查,如果有什么在前面匹配的模式。

使用(?!0?2\/3[01])将确保2/302/31不是匹配。
(?!(?:0?[469]|11)\/31)类似,其确保使用4/31,6/31,9/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])位匹配任何数目从09(该\d,这是相同的[0-9]匹配101112或。
类似地,(?:[1-9]|[12]\d|3[01])匹配从19;或12后跟从09(实质上,1029)的数字;或3031

要结束,我们有$字符。
^相反,它将锚定到字符串的末尾。
没有这个,2/29 i like cookies会匹配。
没有^On 3/20, we will meet here也将被匹配。

我不是世界上最好的老师,我也不是最擅长解释的。
如果你练习,你会看到这开始有意义。
任何关于这个问题的问题,我可以自由回答。

+0

对downvoter:我正在修复它!它正在工作! – 2014-12-04 18:38:39

+0

@HakuKalay至少告诉我这是否符合您的需求,请 – 2014-12-04 18:51:33

+0

接受此为答案。主要是为了清楚地说明我所要求的是不是要用RegEx来完成。如果我知道我不会花一个半小时寻找可能的答案。谢谢。 – NoSaidTheCompiler 2014-12-04 18:57:13