匹配双月、季度等 cron 作业的正则表达式
Regex to match a bi-monthly, quarterly, etc., cron job
我正在尝试编写一些 javascript 正则表达式来验证 cron 作业的每月部分是否有效。
(不熟悉的可以看看https://crontab.guru)
cron job monthly 部分可以指定一个作业是
双月刊,
每3个月,
4个月,
或 6 个月。
每 4 个月发生一次的工作可以用这 4 种格式指定:
- * * * */4 *
- * * * 04,08,12 *
- * * * 4,8,12
- * * * 04,8,12
- * * * 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,11
和 4,8,12
不会匹配,因为每个表达式中的 11
和 12
不会匹配匹配。
有人知道我做错了什么吗?
如果你想按规定支持每 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
我正在尝试编写一些 javascript 正则表达式来验证 cron 作业的每月部分是否有效。 (不熟悉的可以看看https://crontab.guru)
cron job monthly 部分可以指定一个作业是 双月刊, 每3个月, 4个月, 或 6 个月。
每 4 个月发生一次的工作可以用这 4 种格式指定:
- * * * */4 *
- * * * 04,08,12 *
- * * * 4,8,12
- * * * 04,8,12
- * * * 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,11
和 4,8,12
不会匹配,因为每个表达式中的 11
和 12
不会匹配匹配。
有人知道我做错了什么吗?
如果你想按规定支持每 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