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-102-10/12,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/32-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,1312-1312,13-23,5512-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-5/11-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-106-10/16,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/26-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,1312-1312,13-17,2212-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-5/11-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-106-10/16,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/26-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,1312-1312,13-17,2212-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-5/11-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,})
  • 第五组, LXXW, 有效写法有 L1W31W, 正则写法: (?:(?: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-106-10/16,7,8,9,10
  • 第四种: 从6月开始到10月, 每隔2月执行, 写法 6-10/2
  • 第五种: 从3月开始到6月, 8月开始到12月, 每隔2月执行, 写法 3-6,8-12/2
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值