匹配日期
你应该记住,正则表达式是为匹配日期而设计的(或不是)。说日期是有效的是一个更复杂的斗争,因为它需要大量的异常处理(参见闰年条件 )。
让我们从月份(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