【问题标题】:Regex to match a bi-monthly, quarterly, etc., cron job正则表达式匹配双月、季度等 cron 作业
【发布时间】:2021-02-17 04:54:18
【问题描述】:

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

cron 作业每月部分可以指定一个作业是 双月刊, 每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 不会匹配。

有谁知道我做错了什么?

【问题讨论】:

  • 您可以使用 ^\* \* \* (?:0?[48],0?[48],12|\*\/4)(?: \*)?$ regex101.com/r/oAorCl/1 匹配该格式
  • 正则表达式与哪个工具一起使用?有很多不同的正则表达式方言。
  • 我认为正则表达式不适合这项工作。您正在尝试通过模式匹配来验证数值,这就像用螺丝刀搅拌油漆一样。此外,您甚至可能不需要编写代码来执行此操作,因为已经编写了 crontab 验证器。

标签: javascript regex cron expression


【解决方案1】:

如果您想按规定支持每 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

【讨论】:

  • /^(\*\/[2346]|(0?[119]|1[012])(,(0?[1-9]|1[012])){0,5})$/ 假设你的意思是:/^(\*\/[2346]|(0?[1-9]|1[012])(,(0?[1-9]|1[012])){0,5})$/ 对吧?
  • 是的,我修正了错字
  • @yalpsid eman:还有其他问题吗?这符合您的需求吗?
  • 我觉得应该是这样++
猜你喜欢
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多