Cron表达式的正则表达式
目录
介绍
使用代码
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表达式的正则表达式相关推荐
- cron表达式及其验证方法
一.表达式组成 Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 都使用数字,但还可以出现如下特殊字符,它们的含义是: (1) ...
- cron表达式入门_Sourcehunt:Cron管理,Hackathon入门,PHP-GUI…
cron表达式入门 Ready for a new edition of sourcehunt? Get those starring-fingers ready! 准备使用新版本的sourcehun ...
- Cron表达式详解和表达式的验证
Cron表达式详解和表达式的验证 本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表 ...
- 【Cron】学习:cron 表达式
不知道你在玩游戏的时候是否发现过以下情况: 玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次. 又比如很火的王者荣耀手游,它的日常任务,都是每天5点进行更新. 那 ...
- cron表达式(CRON表达式详解)
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month D ...
- 一看就懂:cron 表达式
[前言] 不知道你在玩游戏的时候是否发现过以下情况: (1)玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次. (2)又比如很火的王者荣耀手游,它的日常任务,都是 ...
- java验证cron表达式_Cron表达式详解和表达式的验证
本篇不算原创,因为主要内容来自网上的博客,所以给出我参考文章的链接. 本文cron表达式详解的大部分内容参考了[cron表达式详解]和Quartz使用总结.Cron表达式 这两篇文章. 一.表达式组成 ...
- Schedule 定时任务cron表达式
cron表达式一共有七位,最后一位是年,可以省略,所以我们可以写六位: 第一位: 秒,取值0-59 第二位:分,取值0-59 第三位:小时,取值0-24 第四位:日期(天),取值1-31 第五位:月, ...
- Cron 表达式极速参考
Cron表达式: * * * * * * * 这些星号由左到右按顺序代表 : [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允 ...
最新文章
- 数据库报错: SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null
- mysql的检查点_转载一篇关于mysql检查点的文章
- 如何判断变量是否是数字
- gcc选项 和 gdb 使用
- 第三届Apache Flink 极客挑战赛暨AAIG CUP攻略发布!
- for循环简介及实例(输出九九乘法表)
- Python实现温度转换
- spark发行版笔记13
- 好用的markdown编辑工具Ulysses 25 for Mac
- position的absolute;fixed;relative;static;inherit属性小结
- idea 字体颜色设置 + 背景图片
- 抖音网红简易时钟代码
- 1+5T LineageOS 谷歌相机 相关处理和链接
- Matlab 多行屏蔽或注释方法
- C# 创建 Word 并另存为PDF格式
- 2022 年面向初学者的 10 大免费 3D 建模软件
- 耐得住寂寞,拥得了繁华
- 网页原型设计工具设计_网页设计工具从下往下
- 3.并列句的起源与本质
- Viruses!!!!!
热门文章
- 如何通过ssh登录linux,如何用SSH登录linux?
- php 最长公共子串,PHP实现求解最长公共子串思路方法
- python爬虫抖音音浪_【Python爬虫】抖音去水印
- 正式发布python版本的年份_飞书全新版本π正式发布 高效便捷的团队沟通新工具...
- 华为畅享20不能升级鸿蒙,华为mate20可以升级鸿蒙os吗-mate20能不能更新鸿蒙系统...
- 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
- 如果不清楚设计方向,圣诞设计模板可以帮助你轻松建立节日主题。
- 电商视觉:焦点图的万能构图模板
- 分块 数据不相同_ArcGIS四分法分幅栅格数据(超强版)
- 市面上有哪几种门_实木门、原木门、模压门,各有门道不怕坑!