匹配日期

你應該記住,正規表示式是為匹配日期而設計的(或不是)。說日期是有效的是一個更復雜的鬥爭,因為它需要大量的異常處理(參見閏年條件 )。

讓我們從月份(1 - 12)與可選的前導 0 匹配開始:

0?[1-9]|1[0-2]

為了匹配這一天,還有一個可選的前導 0:

0?[1-9]|[12][0-9]|3[01]

並匹配年份(讓我們假設範圍 1900 - 2999):

(?:19|20)[0-9]{2}

分隔符可以是空格,短劃線,斜線,空格等。你可以隨意新增任何你認為可用作分隔符的內容:

[-\\/ ]?

現在你連線整個事情並得到:

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

如果你想變得更迂腐,你可以使用後向引用來確保兩個分隔符是相同的:

(0?[1-9]|1[0-2])([-\\/ ]?)(0?[1-9]|[12][0-9]|3[01])\2(?:19|20)[0-9]{2} // MMDDYYYY
                                                 ^ refer to [-/ ]
(0?[1-9]|[12][0-9]|3[01])([-\\/ ]?)(0?[1-9]|1[0-2])\2(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}([-\\/ ]?)(0?[1-9]|1[0-2])\2(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD