2014-12-04 60 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