const regex = /^((?<![\d\-\*])((\*\/)?([0-5]?[0-9])((\,|\-|\/)([0-5]?[0-9]))*|\*)[^\S\r\n]+((\*\/)?((2[0-3]|1[0-9]|[0-9]|00))((\,|\-|\/)(2[0-3]|1[0-9]|[0-9]|00))*|\*)[^\S\r\n]+((\*\/)?([1-9]|[12][0-9]|3[01])((\,|\-|\/)([1-9]|[12][0-9]|3[01]))*|\*)[^\S\r\n]+((\*\/)?([1-9]|1[0-2])((\,|\-|\/)([1-9]|1[0-2]))*|\*|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec))[^\S\r\n]+((\*\/)?[0-6]((\,|\-|\/)[0-6])*|\*|00|(sun|mon|tue|wed|thu|fri|sat)))$|^@(annually|yearly|monthly|weekly|daily|hourly|reboot)$/mg;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^((?<![\\d\\-\\*])((\\*\\\/)?([0-5]?[0-9])((\\,|\\-|\\\/)([0-5]?[0-9]))*|\\*)[^\\S\\r\\n]+((\\*\\\/)?((2[0-3]|1[0-9]|[0-9]|00))((\\,|\\-|\\\/)(2[0-3]|1[0-9]|[0-9]|00))*|\\*)[^\\S\\r\\n]+((\\*\\\/)?([1-9]|[12][0-9]|3[01])((\\,|\\-|\\\/)([1-9]|[12][0-9]|3[01]))*|\\*)[^\\S\\r\\n]+((\\*\\\/)?([1-9]|1[0-2])((\\,|\\-|\\\/)([1-9]|1[0-2]))*|\\*|(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec))[^\\S\\r\\n]+((\\*\\\/)?[0-6]((\\,|\\-|\\\/)[0-6])*|\\*|00|(sun|mon|tue|wed|thu|fri|sat)))$|^@(annually|yearly|monthly|weekly|daily|hourly|reboot)$', 'mg')
const str = `#should pass:
5 4 * * sun
* * * * *
0 22 * * 1-5
1 1 1 1 1
23 0-20/2 * * *
* * * * *
0 0,12 1 */2 *
0 4 8-14 * *
0 0 1,15 * 3
@weekly
5 0 * 8 *
23 0-20/2 * * *
0 4 8-14 * *
0 0 1,15 * 3
@hourly
0 0,12 1 */2 *
* * * feb *
* 0-23/2 * * *
* 0,2,4,6,8,10,12,14,16,18,20,22 * * *
50 0 * * *
45 00 * * 1-5
0,30 * * * *
0 0 * * *
00 00 * * *
0,30 * * * *
0 0,12 * * *
5 0 * * *
05 0 * * *
15 14 1 * *
0 22 * * 1-5
23 0-23/2 * * *
* * * * 0-5
* * * 12-12 *
* * * * 0-6
* * 30-31 * *
1-59 * * * *
00 00-00 * * *
* * 30,31 * *
0 22 * * 1-5
23 0-20/2 * * *
23 10-20/10 * * *
* * * * *
* * * * *
#should not pass:
23 55-20/10 * * *
1-60 * * * 1
3 * * * 50
* * * 20 50
1 * * 12-14 *
1 * * * 30
* * * * 0-8
5 * * * 8
* * * * 5,8
* * 30-34 * *
0 * * 0 1-4
0 0 0 12 *
*-* * * * *
* * *-1 * *
*1 * 1 * *
1* * 1 * *`;
// 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