目录

介绍

使用代码

POSIX 版本

“分钟”表达式

“小时”表达式

“月中的某天”表达式

“月”表达式

“星期几”表达式

扩展版本

备注


介绍

Cron是类似Unix系统中基于时间的作业调度程序。它在所谓的crontab文件中根据规范执行作业,该文件在Unix中使用crontab命令进行编辑。

该文件的每一行代表运行特定命令的时间表。cron表达式的POSIX标准版本将作业计划分别匹配到分钟、小时、月中的某一天、月份和一周中的某一天。也有扩展版本,可以定义秒,也可以使用一些特殊的字符和形式,在调度中实现更大的可扩展性。

本文解释了POSIX和cron表达式扩展版本的完整正则表达式。它可用于轻松解析任何支持正则表达式的编程语言中的cron表达式。

以下是有关cron的更多信息:

  • https://en.wikipedia.org/wiki/Cron

使用代码

POSIX 版本

^(?#minute)(\*|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|
(?:\,(?:[0-9]|(?:[1-5][0-9])))*)) (?#hour)(\*|(?:[0-9]|1[0-9]|2[0-3])
(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*))
(?#day_of_month)(\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|
(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*)) (?#month)(\*|
(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:\-(?:[1-9]|
1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(?:\,(?:[1-9]|1[012]|
JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*)) (?#day_of_week)(\*|
(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|
(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))$

cron表达式的POSIX版本如下所示:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

首先,指定分钟,然后指定小时、一个月中的哪一天等等。POSIX 版本允许在每个字段中使用逗号 (,) 分隔的多个值,或者作为由两个值之间的破折号表示的范围。月份可以表示为数字 (1-12) 或3个字符的字符串 (JAN-DEC)。星期几可以表示为数字 (0-6) 或3个字符的字符串 (SUN-SAT)。

分钟表达式

(?#minute)(\*|(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|
(?:\,(?:[0-9]|(?:[1-5][0-9])))*))
  • (?#minute) => 注释
  • \* => 字符*字面意思(任何一分钟)
  • (?:) => 非捕获组
  • (?:[0-9]|(?:[1-5][0-9])) => 0-59
  • (?:\-[0-9]|\-(?:[1-5][0-9]))? => 可能的破折号和0到59之间的数字
  • (?:\,(?:[0-9]|(?:[1-5][0-9])))* => 可能的不定时间逗号后跟0到59之间的数字

小时表达式

(?#hour)(\*|(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|
(?:\,(?:[0-9]|1[0-9]|2[0-3]))*))
  • (?#hour) => 注释
  • \* => 字符*字面意思(任何小时)
  • (?:) => 非捕获组
  • (?:[0-9]|1[0-9]|2[0-3]) => 0-23
  • (?:\-(?:[0-9]|1[0-9]|2[0-3]))? => 可能的破折号和0到23之间的数字
  • (?:\,(?:[0-9]|1[0-9]|2[0-3]))* => 可能的不定时间逗号后跟0到23之间的数字

月中的某天表达式

(?#day_of_month)(\*|(?:[1-9]|(?:[12][0-9])|3[01])(?:(?:\-(?:[1-9]|
(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*))
  • (?#day_of_month) => 注释
  • \* => 字符*字面意思(一个月中的任何一天)
  • (?:) => 非捕获组
  • (?:[1-9]|(?:[12][0-9])|3[01]) => 1-31
  • (?:\-(?:[1-9]|(?:[12][0-9])|3[01]))? => 可能的破折号和1到31之间的数字
  • (?:\,(?:[1-9]|(?:[12][0-9])|3[01]))* => 可能的不定时间逗号后跟1到31之间的数字

表达式

(?#month)(\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|
(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*))
  • (?#month) => 注释
  • \* => 字符*字面意思(一个月中的任何一天)
  • (?:) => 非捕获组
  • (?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) => 1-12 或1-12月
  • (?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))? => 可能的破折号和1到12之间的数字或字符串JAN - DEC
  • (?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))* => 可能的不定时间逗号后跟1到12之间的数字或字符串JAN - DEC

星期几表达式

(?#day_of_week)(\*|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)
(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))
  • (?#day_of_week) => 注释
  • \* => 字符*字面意思(一个月中的任何一天)
  • (?:) => 非捕获组
  • (?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT) => 0-6或SUN-SAT
  • (?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))? => 可能的破折号和0到6之间的数字或字符串SUN - SAT
  • (?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))* => 可能的不定时间逗号后跟0 到6之间的数字或字符串SUN - SAT

扩展版本

^(?#second)(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|
(?:[0-9]|(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*))
(?#minute)(\*|(?:\*|(?:[0-9]|(?:[1-5][0-9])))\/(?:[0-9]|(?:[1-5][0-9]))|(?:[0-9]|
(?:[1-5][0-9]))(?:(?:\-[0-9]|\-(?:[1-5][0-9]))?|(?:\,(?:[0-9]|(?:[1-5][0-9])))*))
(?#hour)(\*|(?:\*|(?:\*|(?:[0-9]|1[0-9]|2[0-3])))\/(?:[0-9]|1[0-9]|2[0-3])|
(?:[0-9]|1[0-9]|2[0-3])(?:(?:\-(?:[0-9]|1[0-9]|2[0-3]))?|(?:\,(?:[0-9]|1[0-9]|2[0-3]))*))
(?#day_of_month)(\*|\?|L(?:W|\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:[1-9]|(?:[12][0-9])|
3[01])(?:W|\/(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:[1-9]|(?:[12][0-9])|3[01])
(?:(?:\-(?:[1-9]|(?:[12][0-9])|3[01]))?|(?:\,(?:[1-9]|(?:[12][0-9])|3[01]))*))
(?#month)(\*|(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
(?:(?:\-(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|
(?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))*))
(?#day_of_week)(\*|\?|[0-6](?:L|\#[1-5])?|(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT)
(?:(?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))?|(?:\,(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))*))
(?#year)(\*|(?:[1-9][0-9]{3})(?:(?:\-[1-9][0-9]{3})?|(?:\,[1-9][0-9]{3})*))$

扩展版本允许在第一个字段中额外指定秒,在最后一个字段中指定年份。

此外,它还允许一些附加选项:

  • \/=> 字符/字面意思——可以与秒、分钟和小时的范围结合使用来指定步长值,即分钟的10/5表示每5分钟从第5分钟开始执行;它与POSIX更长的表达式 5,10,15,20,25,30,35,40,45,50,55相同;*/5 表示每5分钟执行一次(与0/5相同)
  • L=> 与星期几一起指定月份的最后一天,即5L是月份的最后一个星期五或与月份的日期一起指定月份的最后一天;可选地,您可以使用减号来指定与最后一天相关的天数,即。L-5 表示每月最后一天之前的第5天
  • W => 与月份中的某天一起使用以指定最近的工作日,即15W是距每月15日最近的工作日
  • ? => 在某些实现中,这用于省略月中的某天或一周中的某天(它们不能同时使用)
  • #=> 与星期几一起使用来指定月份中的哪一周 (1-5),即5#3是该月的第三个星期五;只能用于数字表示

备注

需要注意的是,这些正则表达式仅解析并负责捕获cron表达式的不同字段。一些逻辑上不允许的组合仍然可以通过,需要在解析正则表达式后在代码中处理。例如:

  • 0 0 0 5 * 5 *——在大多数实现中,不允许同时使用月份和星期几,因此正确的用法是将字符?放 到月中的某一天或星​​期几字段(但不是两者);在POSIX形式中,如果另一个是特定值(受限),则其中一个需要是* ——如果它们都受到限制,则它们今天都需要匹配,否则表达式有问题。
  • 0 0 0 31 2 ? * ——这个表达式应该在日期31.02.上运行,这当然不存在
  • 0 55-33 * * ? *——指定在55到33分钟之间运行;范围的右侧值应始终高于左侧值
  • 0 0 0 ? FEB 4#5 2021 ——这是指2021年2月第5周星期三的00:00:00 - 2月21日没有5周,因此该表达式将意味着该命令将永远不会运行
  • 0 */26 * ? * * *——一般情况下,只能使用可被最大数整除的步骤;在这种情况下,我们希望每26分钟运行一次命令,这将是合法的,但会在时间单位结束时留下不均匀的短期收益率——换句话说,它不会每26分钟运行一次,而是在0 :26,0:52,1:26,1:52 等
  • 0 0 0 ? * * 2222 ——正则表达式允许1000-9999年,但大多数cron实现只允许 1970-2099年

https://www.codeproject.com/Tips/5299523/Regex-for-Cron-Expressions

Cron表达式的正则表达式相关推荐

  1. cron表达式及其验证方法

    一.表达式组成 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 都使用数字,但还可以出现如下特殊字符,它们的含义是: (1) ...

  2. cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…

    cron表达式入门 Ready for a new edition of sourcehunt? Get those starring-fingers ready! 准备使用新版本的sourcehun ...

  3. Cron表达式详解和表达式的验证

    Cron表达式详解和表达式的验证 本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表 ...

  4. 【Cron】学习:cron 表达式

    不知道你在玩游戏的时候是否发现过以下情况: 玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次. 又比如很火的王者荣耀手游,它的日常任务,都是每天5点进行更新. 那 ...

  5. cron表达式(CRON表达式详解)

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month D ...

  6. 一看就懂:cron 表达式

    [前言] 不知道你在玩游戏的时候是否发现过以下情况: (1)玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次. (2)又比如很火的王者荣耀手游,它的日常任务,都是 ...

  7. java验证cron表达式_Cron表达式详解和表达式的验证

    本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. 一.表达式组成 ...

  8. Schedule 定时任务cron表达式

    cron表达式一共有七位,最后一位是年,可以省略,所以我们可以写六位: 第一位: 秒,取值0-59 第二位:分,取值0-59 第三位:小时,取值0-24 第四位:日期(天),取值1-31 第五位:月, ...

  9. Cron 表达式极速参考

    Cron表达式: * * * * * * * 这些星号由左到右按顺序代表 : [秒] [分] [小时] [日] [月] [周] [年] 序号 说明    是否必填   允许填写的值         允 ...

最新文章

  1. 数据库报错: SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null
  2. mysql的检查点_转载一篇关于mysql检查点的文章
  3. 如何判断变量是否是数字
  4. gcc选项 和 gdb 使用
  5. 第三届Apache Flink 极客挑战赛暨AAIG CUP攻略发布!
  6. for循环简介及实例(输出九九乘法表)
  7. Python实现温度转换
  8. spark发行版笔记13
  9. 好用的markdown编辑工具Ulysses 25 for Mac
  10. position的absolute;fixed;relative;static;inherit属性小结
  11. idea 字体颜色设置 + 背景图片
  12. 抖音网红简易时钟代码
  13. 1+5T LineageOS 谷歌相机 相关处理和链接
  14. Matlab 多行屏蔽或注释方法
  15. C# 创建 Word 并另存为PDF格式
  16. 2022 年面向初学者的 10 大免费 3D 建模软件
  17. 耐得住寂寞,拥得了繁华
  18. 网页原型设计工具设计_网页设计工具从下往下
  19. 3.并列句的起源与本质
  20. Viruses!!!!!

热门文章

  1. 如何通过ssh登录linux,如何用SSH登录linux?
  2. php 最长公共子串,PHP实现求解最长公共子串思路方法
  3. python爬虫抖音音浪_【Python爬虫】抖音去水印
  4. 正式发布python版本的年份_飞书全新版本π正式发布 高效便捷的团队沟通新工具...
  5. 华为畅享20不能升级鸿蒙,华为mate20可以升级鸿蒙os吗-mate20能不能更新鸿蒙系统...
  6. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
  7. 如果不清楚设计方向,圣诞设计模板可以帮助你轻松建立节日主题。
  8. 电商视觉:焦点图的万能构图模板
  9. 分块 数据不相同_ArcGIS四分法分幅栅格数据(超强版)
  10. 市面上有哪几种门_实木门、原木门、模压门,各有门道不怕坑!