2014-10-09 81 views
3

我想在我的程序中使用用戶定義的cron表達式。是否有用於cron表達式的驗證器,以便用戶不能插入無效的cron代碼?Cron表達驗證程序

N.B.我認爲Quartz.Net上的cron表達式與UNIX中使用的格式略有不同。我想要它的Quartz版本。

回答

3

UNIX Cron表達式和Quartz類型是不同的。簡單地說,

  • 在Unix中
    • (分鐘,小時,天,月,DAY_OF_WEEK,年)
  • 石英
    • (秒,分鐘,小時,天,月, DAY_OF_WEEK,年)

您可以使用this知道Cron表達是否正確。

編輯:看看CronExpression.ValidateExpression方法。

+2

您鏈接我可以用它來說,如果我的cron是正確的API頁面上發揮作用? – Disasterkid 2014-10-10 06:46:40

0

問題已過時,但現在有更多選擇。

我發現這個新的nuget包NCrontab.Advanced很有用,它可以很好地替代舊的NCrontab,添加更多功能,並且應用範圍更廣。

0

可以使用方法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); 
    }