匹配日期
你應該記住,正規表示式是為匹配日期而設計的(或不是)。說日期是有效的是一個更復雜的鬥爭,因為它需要大量的異常處理(參見閏年條件 )。
讓我們從月份(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