您当前的位置: 首页 >  正则表达式

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Cron表达式的正则表达式

寒冰屋 发布时间:2021-06-28 23:09:12 ,浏览量:1

目录

介绍

使用代码

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)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * 

首先,指定分钟,然后指定小时、一个月中的哪一天等等。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

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.1141s