如何在不创建 AWS 资源的情况下验证 Java 8 中的 AWS cron 表达式?



我正在尝试找到一种方法来验证Java 8中符合AWS要求的cron表达式,而无需创建CloudWatch资源。我目前验证我的 cron 表达式的方法是尝试创建 CW 资源,然后处理抛出的 ParseException。但是,我想知道在部署资源之前,用户输入的 cron 表达式是否是有效的 AWS cron 表达式。

亚马逊是否符合 cron 表达式标准?我一直在阅读AWS文档,看看Amazon cron表达式的要求是否遵循标准(Unix,Quartz等(,但是差异很小,以至于我无法确认它们是否遵循。也许我对 cron 不够了解,但似乎 AWS 有自己的 cron 表达式标准。但是,我没有看到他们提供了自己的 cron 表达式验证器。

如果您正在寻找的全部内容,我会创建一些正则表达式进行验证。 至于它是否遵循标准的cron/crontab规范,答案是否定的。AWS cron 有六个字段,而 cron/crontab 有五个字段。 此外,AWS没有@运算符,许多其他东西都缺失或不同。

这是我见过的关于 AWS cron 的最好的文档: https://docs.aws.amazon.com/glue/latest/dg/monitor-data-warehouse-schedule.html

您可以使用以下正则表达式来验证它:

// Minutes 
/^([*]|([0-5]?d)|((([0-5]?d)|(*))/([0-5]?d))|(([0-5]?d)-([0-5]?d))|((([0-5]?d)|(*))(,(([0-5]?d)|(*)))*))$/
// Hours
/^([*]|[01]?d|2[0-3]|((([01]?d|2[0-3]?)|(*))/([01]?d|2[0-3]?))|(([01]?d|2[0-3]?)-([01]?d|2[0-3]?))|((([01]?d|2[0-3]?)|(*))((,)(([01]?d|2[0-3]?)|(*))){0,23}))$/
// Day of months
/^([*]|[?]|(([1-9]|[12]d|3[01])[LW]?)|(([1-9]|[12]d|3[01])-([1-9]|[12]d|3[01]))|((([1-9]|[12]d|3[01])|(*))(/)([1-9]|[12]d|3[01]))|((([1-9]|[12]d|3[01])|(*))((,)(([1-9]|[12]d|3[01])|(*)))*))$/
// Months
/^([*]|([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|((([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(*))/(([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)))|((([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))-(([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)))|((([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(*))((,)(([2-9]|1[0-2]?)|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(*)))*))$/
// Day of Week
/^([*]|[?]|([1-7]L?)|(SUN|MON|TUE|WED|THU|FRI|SAT)|((([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT))(-|,|#)(([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT)))|((([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT)|(*))/(([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT)))|((([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT)|(*))((,)(([1-7])|(SUN|MON|TUE|WED|THU|FRI|SAT)|(*)))*))$/
// Year
/^([*]|([1-2]d{3})|(((([1-2]d{3})|(*)))/((d{0,4})))|(([1-2]d{3})-([1-2]d{0,3}))|((([1-2]d{3})|(*))((,)(([1-2]d{3})|(*)))*))$/

注意:年份正则表达式不检查范围(1970 - 2199(,但可以使用代码轻松完成。