匹配双月、季度等 cron 作业的正则表达式

Regex to match a bi-monthly, quarterly, etc., cron job

我正在尝试编写一些 javascript 正则表达式来验证 cron 作业的每月部分是否有效。 (不熟悉的可以看看https://crontab.guru

cron job monthly 部分可以指定一个作业是 双月刊, 每3个月, 4个月, 或 6 个月。

每 4 个月发生一次的工作可以用这 4 种格式指定:

  1. * * * */4 *
  2. * * * 04,08,12 *
  3. * * * 4,8,12
  4. * * * 04,8,12
  5. * * * 4,08,12

第一种格式的正则表达式可能如下所示:([*][/][2346]) 可以与正则表达式进行布尔值或运算以覆盖其余部分。

对于其余部分,我想出了 (0?[1-9]|1[012])(,(0?[1-9]|1[012]))* 的完整正则表达式:(0?[1-9]|1[012])(,(0?[1-9]|1[012]))*|([*][/][2346])

但这似乎不起作用!

使用 https://regexr.com/4jp54 上的正则表达式测试器,可以看到第一个和第二个布尔值 OR (|) 右侧的每个正则表达式都没有按预期工作,因此这两个实例|1[012] 好像不行。

所以 01,03,5,7,09 会匹配,但是 01,03,5,7,09,114,8,12 不会匹配,因为每个表达式中的 1112 不会匹配匹配。

有人知道我做错了什么吗?

如果你想按规定支持每 2、3、4、6 个月,包括单月如 * * * 3 * 和奇数月如 * * * 3,7,11 * 你可以使用这个正则表达式(正则表达式仅适用于月份部分):

/^(\*\/[2346]|(0?[1-9]|1[012])(,(0?[1-9]|1[012])){0,5})$/

解释:

  • ^ - 开始时锚定
  • ( - 组开始
    • \*\/[2346] - 分数格式,例如 /4
  • | - 或者
    • (0?[1-9]|1[012]) - 月数 1 ... 12,可选前导零
    • (,(0?[1-9]|1[012])){0,5} - 模式重复 0 到 5 次:, 后跟月份数
  • ) - 组结束
  • $ - 锚点在末尾

这将验证月份,例如:

*/2
*/4
06             // 1x - once a year
02,10          // 2x - every 6 month
03,07,11       // 3x - every 4 odd month
4,8,12         // 3x - every 4 even month
03,6,9,12      // 4x - every 3 month
02,4,6,8,10,12 // 6x - every 2 month