用于验证 Cron 作业的 C# 表达式 [关闭]

Posted

技术标签:

【中文标题】用于验证 Cron 作业的 C# 表达式 [关闭]【英文标题】:C# expression to validate a Cron job [closed] 【发布时间】:2022-01-22 20:44:30 【问题描述】:

验证此类表达式的最佳方法是有效的 cron 表达式(在 C# 中)

“At 00:00 on Friday.”
Cron Expression passed in
0 0 * * FRI

【问题讨论】:

如果表达式有效但不正确怎么办?例如。您想“周五 00:00”,但您得到“0 0 1 * * FRI”,它有效但仅指定该月的第一天 【参考方案1】:

你可以使用这个:https://www.nuget.org/packages/NCrontab.Advanced/

或使用此参考:

https://quartznet.sourceforge.io/apidoc/2.0/html/

bool IsValid = IsValidSchedule("0 0 * * FRI"); 

然后:

   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)+(\?|\*|(?:|\d4)(?:(?:-|\/|\,)(?:|\d4))?(?:,(?:|\d4)(?:(?:-|\/|\,)(?:|\d4))?)*))$";
    
            return valid&& Regex.IsMatch(schedule, regex);
        

【讨论】:

这可能是最被接受的方法。但是有没有办法在不使用 Quartz 的情况下做到这一点? @w2olves 你在你的问题中根本没有提到它。 @Leanadro 这是真的。我提到了 C#,并假设它不是库推荐。谢谢你的回答 Leandro Bardelli,我也厌倦了引入庞大的库来管理 CRON 表达式。目前,我没有“IsValid”方法,但您可以重新设置静态 ValidateExpression,使其返回布尔值而不是引发异常。见:github.com/rashadrivera/CronExpression/blob/master/…

以上是关于用于验证 Cron 作业的 C# 表达式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为经过验证的行为电子邮件和丢失密码计时器编写 cron 作业脚本? [关闭]

c# 中用于文件夹路径验证(远程路径、FTP 路径、本地系统文件夹路径等)的单个正则表达式 [关闭]

Quartz Scheduler作业在触发后连续运行

无法安装 CRON 作业 [关闭]

测试每周的 cron 作业 [关闭]

Ubuntu 18.04 上的 cron 作业的身份验证问题