匹配日期

你应该记住,正则表达式是为匹配日期而设计的(或不是)。说日期是有效的是一个更复杂的斗争,因为它需要大量的异常处理(参见闰年条件 )。

让我们从月份(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