const regex = /^(?=\d{2}([-\/])\d{2}(?:\1)\d{4})(?:((?:(?:0[13578]|1[02])[-\/](?:0[1-9]|[1-2]\d|3[01])|(?:0[469]|11)[-\/](?:0[1-9]|[1-2]\d|30)|02[-\/](?:0[1-9]|[1-2]\d))[-\/])(?:19\d{2}|200[0-4])|(?!09[-\/](?:19|2|3)|1)(?-1)2005)$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?=\\d{2}([-\\\/])\\d{2}(?:\\1)\\d{4})(?:((?:(?:0[13578]|1[02])[-\\\/](?:0[1-9]|[1-2]\\d|3[01])|(?:0[469]|11)[-\\\/](?:0[1-9]|[1-2]\\d|30)|02[-\\\/](?:0[1-9]|[1-2]\\d))[-\\\/])(?:19\\d{2}|200[0-4])|(?!09[-\\\/](?:19|2|3)|1)(?-1)2005)$', 'gm')
const str = `MATCH:
09/18/2005
08/05/2004
01/01/2000
01/02/1934
09-18-2005
12/13/2000
12/31/2000
12-31-2000
11/30/2000
02/28/2002
02/29/2002
04-30-2005
06/04/1987
10/23/1999
02/25/2004
NO MATCH:
01/01/2006
09/19/2005
09/25/2005
09-19-2005
09-18/2005
09/18-2005
10/20/2005
08/34/2004
01/00/2000
00/01/2000
001/01/2000
01/001/2000
13/14/2000
12/32/2000
11/31/2000
11/30/ 2000
01/02/1834
02/30/2002
04-31-2005
09/18/2023
06/23/2008
04/03/2026`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions