Crond表达式正则解析
Crond表达式正则解析
一. Crond表达式
Cron表达式是一个字符串, 表示一个执行周期, 常用于Linux的Crond, 或Java开发的QuartZ定时任务框架等. 可参考Crond表达式解析.
二. Crond结构
Cron表达式是一个字符串, 字符串中由空格隔开, 分为6或7个域, 每一个域代表一个含义, 语法格式如下, 可参考Crond表达式解析:
* | * | * | * | * | * | * |
---|---|---|---|---|---|---|
秒 | 分 | 时 | 日 | 月 | 周 | 年 |
Seconds | Minutes | Hours | DayOfMonth | Month | DayOfWeek | Year |
必选 | 必选 | 必选 | 必选 | 必选 | 必选 | 可选 |
0 ~ 59整数 | 0 ~ 59整数 | 0 ~ 23整数 | 1 ~ 31整数 (随月份而定) |
1 ~ 12整数 JAN ~ DEC月份 |
1 ~ 7整数 SUN ~ SAT (1=SUN) |
1970~2099 |
三. Crond表达式分域正则解析
3.1 秒
3.1.1 秒域
的有效写法
- 第一种: 每秒执行1次, 写法
*
或*/1
- 第二种: 每3秒执行1次, 写法
*/3
- 第三种: 从第2秒开始到第10秒, 每秒执行1次, 写法
2-10
或2-10/1
或2,3,4,5,6,7,8,9,10
- 第四种: 从第2秒开始到第10秒, 每3秒执行1次, 写法
2-10/3
- 第五种: 从第2秒开始到第10秒, 第22秒开始到第30秒, 每3秒执行1次, 写法
2-10,22-30/3
- 其他
3.1.2 秒域
的无效写法
- 第四种: 从第2秒开始到第10秒, 每3秒执行1次, 无效写法
2,3,4,5,6,7,8,9,10/3
或2-8,9,10/3
3.1.3 正则适配如下
根据上述有效写法, 规整, 拆分正则表达如下, 域最后必须有至少 1个
空格
结尾:
- 第一组, 带有
*
号, 有效写法有*
或*/x, x是1-59的数字
, 正则写法:(?:\*(?:/(?:[1-9]|[1-5][0-9])){0,1}\s{1,})
- 第二组, 一个
纯数字
, 有效写法y, y是0-59的数字
或y/x, y是0-59的数字, x是1-59的数字
, 正则写法(?:[0-5]{0,1}[0-9]{1}(?:/(?:[1-9]|[1-5][0-9])){0,1}\s{1,})
- 第三组,
数字
带有,
和-
号, 不含/
号, 有效写法有12,13
或12-13
或12,13-23,55
或12-15,18-23,55
, 正则写法:(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1}(?:,(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1})){0,}\s{1,})
- 逻辑1: 必定以一个
数字开头
- 逻辑2: 开头数字后面可以链接
-
- 逻辑3: 从第2组开始, 通过链接
,
接下一组, 重复第1组的逻辑
- 逻辑1: 必定以一个
- 第四组,
数字
带有-
号 和,
号 和/
号, 有效写法1-5/1
或1-5,7-10/1
, 无效写法1,2-5/1
, 正则写法:(?:[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}(?:,[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}){0,}/(?:[1-9]|[1-5][0-9])\s{1,})
- 注意
第一组
和第二组
可以合并写成:(?:(?:\*|[0-5]{0,1}[0-9]{1})(?:/(?:[1-9]|[1-5][0-9])){0,1}\s{1,})
3.1.4 秒域
完整写法如下:
- 非捕获组写法:
(?:(?:(?:(?:\*|[0-5]{0,1}[0-9]{1})(?:/(?:[1-9]|[1-5][0-9])){0,1})|(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1}(?:,(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1})){0,})|(?:[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}(?:,[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}){0,}/(?:[1-9]|[1-5][0-9])))\s{1,})
- 捕获组写法:
(?:((?:(?:\*|[0-5]{0,1}[0-9]{1})(?:/(?:[1-9]|[1-5][0-9])){0,1})|(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1}(?:,(?:[0-5]{0,1}[0-9]{1}(?:\-[0-5]{0,1}[0-9]{1}){0,1})){0,})|(?:[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}(?:,[0-5]{0,1}[0-9]{1}\-[0-5]{0,1}[0-9]{1}){0,}/(?:[1-9]|[1-5][0-9])))\s{1,})
3.2 分
同秒域写法相同.
3.3 时
3.3.1 时域
的有效写法
- 第一种: 每小时都执行, 写法
*
或*/1
- 第二种: 每隔3时时执行1次, 写法
*/3
- 第三种: 从6时开始到10时, 每小时执行1次, 写法
6-10
或6-10/1
或6,7,8,9,10
- 第四种: 从6时开始到10时, 每隔2小时执行1次, 写法
6-10/2
- 第五种: 从6时开始到10时, 15时开始到18时, 每隔2小时执行1次, 写法
6-10,15-18/2
- 其他
3.3.2 时域
的无效写法
- 第一种: 从6时开始到10时, 每隔2小时执行1次, 无效写法
6,7,8,9,10/2
或6-8,9,10/2
3.3.3 正则适配如下
根据上述有效写法, 规整, 拆分正则表达如下, 域最后必须有至少 1个
空格
结尾:
- 第一组, 带有
*
号, 有效写法有*
或*/x, x是1-23的数字
, 正则写法:(?:\*(?:/(?:[1-9]|1[0-9]|2[0-3])){0,1}\s{1,})
- 第二组, 一个
纯数字
, 有效写法y, y是0-23的数字
或y/x, y是0-23的数字, x是1-23的数字
, 正则写法(?:(?:[0-9]|1[0-9]|2[0-3])(?:/(?:[1-9]|1[0-9]|2[0-3])){0,1}\s{1,})
- 第三组,
数字
带有,
和-
号, 不含/
号, 有效写法有12,13
或12-13
或12,13-17,22
或12-15,18-20,22
, 正则写法:(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1}(?:,(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1})){0,}\s{1,})
- 逻辑1: 必定以一个
数字开头
- 逻辑2: 开头数字后面可以链接
-
- 逻辑3: 从第2组开始, 通过链接
,
接下一组, 重复第1组的逻辑
- 逻辑1: 必定以一个
- 第四组,
数字
带有-
号 和,
号 和/
号, 有效写法1-5/1
或1-5,7-10/1
, 无效写法1,2-5/1
, 正则写法:(?:(?:[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,}/(?:[1-9]|1[0-9]|2[0-3])\s{1,})
- 注意
第一组
和第二组
可以合并写成:(?:(?:\*|[0-9]|1[0-9]|2[0-3])(?:/(?:[1-9]|1[0-9]|2[0-3])){0,1}\s{1,})
3.3.4 时域
完整写法如下:
- 非捕获组写法:
(?:(?:(?:(?:\*|[0-9]|1[0-9]|2[0-3])(?:/(?:[1-9]|1[0-9]|2[0-3])){0,1})|(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1}(?:,(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1})){0,})|(?:(?:[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,}/(?:[1-9]|1[0-9]|2[0-3])))\s{1,})
- 捕获组写法:
(?:((?:(?:\*|[0-9]|1[0-9]|2[0-3])(?:/(?:[1-9]|1[0-9]|2[0-3])){0,1})|(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1}(?:,(?:(?:[0-9]|1[0-9]|2[0-3])(?:\-(?:[0-9]|1[0-9]|2[0-3])){0,1})){0,})|(?:(?:[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,}/(?:[1-9]|1[0-9]|2[0-3])))\s{1,})
3.4 日
3.4.1 日域
的有效写法
- 第一种: 每天都执行, 写法
*
或*/1
- 第二种: 每隔3天执行1次, 写法
*/3
- 第三种: 从每月6日开始到10日执行, 写法
6-10
或6-10/1
或6,7,8,9,10
- 第四种: 从每月6日开始到10日, 每隔2日执行, 写法
6-10/2
- 第五种: 从每月6日开始到10日, 15日开始到18日, 每隔2日执行, 写法
6-10,15-18/2
- 第六种: 每月最后一天, 写法
L
, 有些工具不支持些选项, 例如部分crond
- 第七种: 每月 XX 号最近的工作日, 写法
XXW
, 有些工具不支持些选项, 例如部分crond
- 其他
3.4.2 日域
的无效写法
- 第一种: 从每月6日开始到10日, 每隔2日执行, 无效写法
6,7,8,9,10/2
或6-8,9,10/2
3.4.3 正则适配如下
根据上述有效写法, 规整, 拆分正则表达如下, 域最后必须有至少 1个
空格
结尾:
- 第一组, 带有
*
号, 有效写法有*
或*/x, x是1-31的数字
, 正则写法:(?:\*(?:/(?:[1-9]|[1-2][0-9]|3[0-1])){0,1}\s{1,})
- 第二组, 一个
纯数字
, 有效写法y, y是0-31的数字
或y/x, y是0-31的数字, x是1-31的数字
, 正则写法(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:/(?:[1-9]|[1-2][0-9]|3[0-1])){0,1}\s{1,})
- 第三组,
数字
带有,
和-
号, 不含/
号, 有效写法有12,13
或12-13
或12,13-17,22
或12-15,18-20,22
, 正则写法:(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1}(?:,(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1})){0,}\s{1,})
- 逻辑1: 必定以一个
数字开头
- 逻辑2: 开头数字后面可以链接
-
- 逻辑3: 从第2组开始, 通过链接
,
接下一组, 重复第1组的逻辑
- 逻辑1: 必定以一个
- 第四组,
数字
带有-
号 和,
号 和/
号, 有效写法1-5/1
或1-5,7-10/1
, 无效写法1,2-5/1
, 正则写法:(?:(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])(?:,(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,}/(?:[1-9]|[1-2][0-9]|3[0-1])\s{1,})
- 第五组,
L
或XXW
, 有效写法有L
或1W
或31W
, 正则写法:(?:(?:L|(?:[0-9]|[1-2][0-9]|3[0-1])W)\s{1,})
- 注意
第一组
和第二组
可以合并写成:(?:(?:\*|(?:[0-9]|[1-2][0-9]|3[0-1]))(?:/(?:[1-9]|[1-2][0-9]|3[0-1])){0,1}\s{1,})
3.4.4 日域
完整写法如下:
- 非捕获组写法:
(?:(?:L|(?:[0-9]|[1-2][0-9]|3[0-1])W|(?:(?:\*|(?:[0-9]|[1-2][0-9]|3[0-1]))(?:/(?:[1-9]|[1-2][0-9]|3[0-1])){0,1})|(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1}(?:,(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1})){0,})|(?:(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])(?:,(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,}/(?:[1-9]|[1-2][0-9]|3[0-1])))\s{1,})
- 捕获组写法:
(?:(L|(?:[0-9]|[1-2][0-9]|3[0-1])W|(?:(?:\*|(?:[0-9]|[1-2][0-9]|3[0-1]))(?:/(?:[1-9]|[1-2][0-9]|3[0-1])){0,1})|(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1}(?:,(?:(?:[0-9]|[1-2][0-9]|3[0-1])(?:\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,1})){0,})|(?:(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])(?:,(?:[0-9]|[1-2][0-9]|3[0-1])\-(?:[0-9]|[1-2][0-9]|3[0-1])){0,}/(?:[1-9]|[1-2][0-9]|3[0-1])))\s{1,})
3.5 月
3.5.1 月域
的有效写法
- 第一种: 每月都执行, 写法
*
或*/1
- 第二种: 每隔3月执行, 写法
*/3
- 第三种: 从6月开始到10月, 每月执行, 写法
6-10
或6-10/1
或6,7,8,9,10
- 第四种: 从6月开始到10月, 每隔2月执行, 写法
6-10/2
- 第五种: 从3月开始到6月, 8月开始到12月, 每隔2月执行, 写法
3-6,8-12/2
- 其