cron表达式及其验证方法
一、表达式组成Cron表达式是一个字符串字符串以5或6个空格隔开分为6或7个域每一个域代表一个含义Cron有如下两种语法格式都使用数字但还可以出现如下特殊字符它们的含义是(1)表示匹配该域的任意值假如在Minutes域使用, 即表示每分钟都会触发事件。(2) ? :只能用在DayofMonth和DayofWeek两个域。因为DayofMonth和 DayofWeek会相互影响所以按我的理解?应该是占位符。例如想在每月的20日触发调度不管20日到底是星期几则只能使用如下写法 13 13 15 20 * ?, 其中最后一位只能用而不能使用*。(3) - :表示范围例如在Minutes域使用5-20表示从5分到20分钟每分钟触发一次(4)/表示起始时间开始触发然后每隔固定时间触发一次例如在Minutes域使用5/20,则意味着5分钟触发一次而2545等分别触发一次.(5) , :表示列出枚举值值。例如在Minutes域使用5,20则意味着在5和20分每分钟触发一次。(6) L :表示最后只能出现在DayofWeek和DayofMonth域如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。(7) W: 表示有效工作日(周一到周五),只能出现在DayofMonth域系统将在离指定日期的最近的有效工作日触发事件。例如在 DayofMonth使用5W如果5日是星期六则将在最近的工作日星期五即4日触发。如果5日是星期天则在6日(周一)触发如果5日在星期一 到星期五中的一天则就在5日触发。另外一点W的最近寻找不会跨过月份(8) LW :这两个字符可以连用表示在某个月最后一个工作日即最后一个星期五。(9) # :用于确定每个月第几个星期几只能出现在DayofMonth域。例如在4#2表示某月的第二个星期三。难点解析本篇主要看6个字符的表达式。cron本身是很容易理解的单个拆开来看都很容易理解。但是全部写起来却容易出问题。例如我们想写一个每天都执行的表达式。如果是新手的话我们可能下意识地会这样写0 0 0 * * *这样写理由很充分因为每天0时0分0秒嘛所以前三个都是0日期、月份和星期都是任意的所以全是*。但是事实上月份中的日期和星期中的日期这两个元素互斥的例如你设置了每月1号又设置了每周一我们可以理解为cron表达式不能处理或的关系。所以正确的写法是:验证cron表达式方法。正则表达式方法String regEx “(((([0-9]|[0-5][0-9])(\,|\-|\/){1}([0-9]|[0-5][0-9]))|([0-9]|[0-5][0-9])|^(\*))((([0-9]|[0-5][0-9])(\,|\-|\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9])|(\* ))((([0-9]|[01][0-9]|2[0-3])(\,|\-|\/){1}([0-9]|[01][0-9]|2[0-3]))|([0-9]|[01][0-9]|2[0-3]) |(\*))((([0-9]|[0-2][0-9]|3[01])(\,|\-|\/){1}([0-9]|[0-2][0-9]|3[01]))|(([0-9]|[0-2][0-9]|3[01]) )|(\? )|(\* )|(([1-9]|[0-2][0-9]|3[01])L)|([1-7]W )|(LW )|([1-7]\#[1-4]))((([1-9]|0[1-9]|1[0-2])(\,|\-|\/){1}([1-9]|0[1-9]|1[0-2]) )|([1-9]|0[1-9]|1[0-2])|(\*))((1-7{1}[1-7])|([1-7])|(\?)|(\)|(([1-7]L)|([1-7]\#[1-4]))))|(((^([0-9]|[0-5][0-9])(\,|\-|\/){1}([0-9]|[0-5][0-9]))|^([0-9]|[0-5][0-9]) |^(\))((([0-9]|[0-5][0-9])(\,|\-|\/){1}([0-9]|[0-5][0-9]) )|([0-9]|[0-5][0-9])|(\* ))((([0-9]|[01][0-9]|2[0-3])(\,|\-|\/){1}([0-9]|[01][0-9]|2[0-3]))|([0-9]|[01][0-9]|2[0-3]) |(\*))((([0-9]|[0-2][0-9]|3[01])(\,|\-|\/){1}([0-9]|[0-2][0-9]|3[01]))|(([0-9]|[0-2][0-9]|3[01]) )|(\? )|(\* )|(([1-9]|[0-2][0-9]|3[01])L)|([1-7]W )|(LW )|([1-7]\#[1-4]))((([1-9]|0[1-9]|1[0-2])(\,|\-|\/){1}([1-9]|0[1-9]|1[0-2]))|([1-9]|0[1-9]|1[0-2]) |(\* ))((1-7{1}[1-7] )|([1-7] )|(\?)|(\* )|(([1-7]L )|([1-7]\#[1-4]) ))((19[789][0-9]|20[0-9][0-9])\-(19[789][0-9]|20[0-9][0-9])))”;String tests 0 0 0 L * ?;System.out.println(tests.matches(regEx));CronExpression验证这个方法需要引入quartz的jar包然后只需要一行代码就可以验证了。CronExpression.isValidExpression(cron)