const regex = /^(?:
(?:0[1-9]|1\d|2[0-8])([\/-])(?:02)\1(?:\d+)|
(?:0[1-9]|1\d|2\d)([\/-])(?:02)\2(?:(?:\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D|\b))|
(?:0[1-9]|1\d|2\d|30)([\/-])(?:0[469]|11)\3(?:\d+)|
(?:0[1-9]|1\d|2\d|3[01])([\/-])(?:0[13578]|1[02])\4(?:\d+)|
(?:02)([\/-])(?:0[1-9]|1\d|2[0-8])\5(?:\d+)|
(?:02)([\/-])(?:0[1-9]|1\d|2\d)\6(?:(?:\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D|\b))|
(?:0[469]|11)([\/-])(?:0[1-9]|1\d|2\d|30)\7(?:\d+)|
(?:0[13578]|1[02])([\/-])(?:0[1-9]|1\d|2\d|3[01])\8(?:\d+)|
(?:\d+)([\/-])(?:0[1-9]|1\d|2[0-8])\9(?:02)|
(?:(?:\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D|\b))([\/-])(?:0[1-9]|1\d|2\d)\10(?:02)|
(?:\d+)([\/-])(?:0[1-9]|1\d|2\d|30)\11(?:0[469]|11)|
(?:\d+)([\/-])(?:0[1-9]|1\d|2\d|3[01])\12(?:0[13578]|1[02])|
(?:\d+)([\/-])(?:02)\13(?:0[1-9]|1\d|2[0-8])|
(?:(?:\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D|\b))([\/-])(?:02)\14(?:0[1-9]|1\d|2\d)|
(?:\d+)([\/-])\15(?:0[469]|11)(?:0[1-9]|1\d|2\d|30)|
(?:\d+)([\/-])(?:0[13578]|1[02])\16(?:0[1-9]|1\d|2\d|3[01])
)$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?:
(?:0[1-9]|1\\d|2[0-8])([\\\/-])(?:02)\\1(?:\\d+)|
(?:0[1-9]|1\\d|2\\d)([\\\/-])(?:02)\\2(?:(?:\\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\\D|\\b))|
(?:0[1-9]|1\\d|2\\d|30)([\\\/-])(?:0[469]|11)\\3(?:\\d+)|
(?:0[1-9]|1\\d|2\\d|3[01])([\\\/-])(?:0[13578]|1[02])\\4(?:\\d+)|
(?:02)([\\\/-])(?:0[1-9]|1\\d|2[0-8])\\5(?:\\d+)|
(?:02)([\\\/-])(?:0[1-9]|1\\d|2\\d)\\6(?:(?:\\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\\D|\\b))|
(?:0[469]|11)([\\\/-])(?:0[1-9]|1\\d|2\\d|30)\\7(?:\\d+)|
(?:0[13578]|1[02])([\\\/-])(?:0[1-9]|1\\d|2\\d|3[01])\\8(?:\\d+)|
(?:\\d+)([\\\/-])(?:0[1-9]|1\\d|2[0-8])\\9(?:02)|
(?:(?:\\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\\D|\\b))([\\\/-])(?:0[1-9]|1\\d|2\\d)\\10(?:02)|
(?:\\d+)([\\\/-])(?:0[1-9]|1\\d|2\\d|30)\\11(?:0[469]|11)|
(?:\\d+)([\\\/-])(?:0[1-9]|1\\d|2\\d|3[01])\\12(?:0[13578]|1[02])|
(?:\\d+)([\\\/-])(?:02)\\13(?:0[1-9]|1\\d|2[0-8])|
(?:(?:\\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\\D|\\b))([\\\/-])(?:02)\\14(?:0[1-9]|1\\d|2\\d)|
(?:\\d+)([\\\/-])\\15(?:0[469]|11)(?:0[1-9]|1\\d|2\\d|30)|
(?:\\d+)([\\\/-])(?:0[13578]|1[02])\\16(?:0[1-9]|1\\d|2\\d|3[01])
)$', 'gm')
const str = `30/11/2017
30-11-2017
2017-05-31
30-/11-/2017
30-11/2017`;
// 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