2011-05-20 81 views
1

我的正則表達式有問題。這裏是。正則表達式日期匹配不起作用

/0[1-9]|1[0-2]|^[1-9]{1}$\/^[1-9]{1}$|0[1-9]|[1-2]\d|3[0-1]\/19\d{2}|20\d{2}/ 

它不應該與這個日期,

1/32/2006 

但由於某種原因它是匹配,你能告訴我什麼,我做錯了什麼?

+0

對於正則表達式,通常更好地告訴我們你想要匹配的條件 – Duniyadnd 2011-05-20 22:35:01

回答

2

你似乎有幾個問題。

正則表達式在第一個替代匹配 「06」(2006年)已上市的 「0 [1-9]」

你可能是指

/^(0[1-9]|1[0-2]|^[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/(19\d{2}|20\d{2})$/ 

或類似的東西(我還沒有測試過這個正則表達式,它可能還有其他問題),但是你應該看看Regular Expression to match a valid day in a date,以便看到更好的正則表達式和智慧的詞語,在正則表達式中這樣做。

1

您需要對這些部分進行分組,並擺脫^$

/(0[1-9]|1[0-2]|[1-9]{1})\/([1-9]{1}|0[1-9]|[1-2]\d|3[0-1])\/((19|20)\d{2})/ 
+0

看起來塞思更新他的答案比我寫(和測試)我的更快。 :-) – 2011-05-20 22:37:26

0

正則表達式匹配日期here有很好的概述。特別是,它列出了正則表達式匹配MM/DD/YYYY日期:

^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$ 
1

即使所有的間距和更好的分隔符,

m{ 
    ^
    (?: 0[1-9] | 1[0-2]? | [2-9]) 
    /
    (?: 0[1-9] | 1[0-9]? | 2[0-9]? | 3[0-1]? | [4-9]) 
    /
    (?: (?:19|20)[0-9]{2}) 
    \z 
}x 

是幾乎沒有可讀性

m{^([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}) \z }x 
    && $1 >= 1 && $1 <= 12 
    && $2 >= 1 && $2 <= 31 
    && $3 >= 1900 && $3 <= 2099 

我已經申請了一些修正:

  1. \d不等於[0-9]
  2. $允許換行。
  3. 我避免了不必要的捕獲(因爲原來沒有它們)。
2

這很有趣:

^[1-9]{1}$ 

看起來你正在使用的匹配,這不是之前或之後另一個數字一個數字。這是行不通的。 ^$將匹配定位到字符串的開頭和結尾,{1}什麼都不做。

如果要允許與可選的前導零的單數字,使用此:

0?[1-9] 

的完整的regex將被:

(?:1[02]|0?[1-9])\/(?:3[01]|[12]\d|0?[1-9])\/(?:19\d{2}|20\d{2}) 

我還添加正如@Seth所建議的,用於分組的括號。