Cron表达式验证器

9
我想在我的程序中使用用户定义的cron表达式。是否有用于cron表达式的验证器,以便用户无法插入无效的cron代码?
注意: 我认为Quartz.Net上的cron表达式与UNIX中使用的表达式格式略有不同。我需要它的Quartz版本。
3个回答

8

UNIX Cron表达式和Quartz表达式是不同的。简单来说,

  • 在Unix中
    • (分钟,小时,日,月,周几,年)
  • 在Quartz中
    • (秒,分钟,小时,日,月,周几,年)

您可以使用this来检查Cron表达式是否正确。

编辑:查看CronExpression.ValidateExpression方法。


2
你链接的 API 页面中有哪个函数可以用来判断我的定时任务是否正确? - disasterkid
只是为了补充一下这个答案,如果你想根据这个调用做出决策,我们可以使用CronExpression.IsValidExpression(string expression)。 - undefined

2

这个问题已经有些年头了,但现在有更多的选择。

我发现这个新的nuget包NCrontab.Advanced非常有用,它是较旧的NCrontab的很好替代品,增加了更多功能,并且应该具有更广泛的应用范围。


1
可以使用 CronExpression.IsValidateExpression() 方法,并结合正则表达式进行额外的验证。
示例:
public static bool IsValidSchedule(string schedule) {

        var valid = CronExpression.IsValidExpression(schedule);
        // Some expressions are parsed as valid by the above method but they are not valid, like "* * * ? * *&54".
        //In order to avoid such invalid expressions an additional check is required, that is done using the below regex.

        var regex = @"^\s*($|#|\w+\s*=|(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?(?:,(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?)*)\s+(\?|\*|(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?(?:,(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?)*)\s+(\?|\*|(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\?|\*|(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*)\s+(\?|\*|(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?(?:,(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?)*|\?|\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\s)+(\?|\*|(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?(?:,(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?)*))$";

        return valid&& Regex.IsMatch(schedule, regex);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接