Cron表达式的正则表达式

Cron表达式的正则表达式目录介绍使用代码POSIX版本“分钟”表达式“小时”表达式“月中的某天”表达式“月”表达式“星期几”表达式扩展版本备注介绍Cron是类似Unix系统中基于时间的作业调度程序。它在所谓的crontab文件中根据规范执行作业,该文件在Unix中使用crontab命令进行编辑。该文件的每一行代表运行特定命令的时间表。cron表达式的POSIX标准版本将作业计划分别匹配到分钟、小时、月中的某一天、月份和一周中的某一天。也有扩展版本,可以定义秒,也可以使用一些特殊

目录

介绍

使用代码

POSIX 版本

“分钟”表达式

“小时”表达式

“月中的某天”表达式

“月”表达式

“星期几”表达式

扩展版本

备注


介绍

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

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

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

以下是有关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]))? => 可能的破折号和059之间的数字
  • (?:\,(?:[0-9]|(?:[1-5][0-9])))* => 可能的不定时间逗号后跟059之间的数字

小时表达式

(?#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]))? => 可能的破折号和023之间的数字
  • (?:\,(?:[0-9]|1[0-9]|2[0-3]))* => 可能的不定时间逗号后跟023之间的数字

月中的某天表达式

(?#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]))? => 可能的破折号和131之间的数字
  • (?:\,(?:[1-9]|(?:[12][0-9])|3[01]))* => 可能的不定时间逗号后跟131之间的数字

表达式

(?#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))? => 可能的破折号和112之间的数字或字符串JAN – DEC
  • (?:\,(?:[1-9]|1[012]|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))* => 可能的不定时间逗号后跟112之间的数字或字符串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-6SUN-SAT
  • (?:\-(?:[0-6]|SUN|MON|TUE|WED|THU|FRI|SAT))? => 可能的破折号和06之间的数字或字符串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 * * ? *——指定在5533分钟之间运行;范围的右侧值应始终高于左侧值
  • 0 0 0 ? FEB 4#5 2021 ——这是指20212月第5周星期三的00:00:00 – 221日没有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表达式的正则表达式分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/7666.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注