jquery validate cron

本文介绍了一段JavaScript代码,用于验证Cron表达式的合法性。该代码通过多个辅助函数检查秒、分钟、小时等字段的有效性,并支持通配符、范围及增量等常见Cron表达式特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

验证cron表达式的js代码:


function isCronExpress(cronExpression){
var cronParams = cronExpression.split(" ");

if (cronParams.length < 6 || cronParams.length > 7) {
return false;
}

//CronTrigger cronTrigger = new CronTrigger();
//cronTrigger.setCronExpression( cronExpression );

if (cronParams[3] == "?" || cronParams[5]=="?") {
//Check seconds param
if (!checkSecondsField(cronParams[0])) {
return false;
}


//Check minutes param
if (!checkMinutesField(cronParams[1])) {
return false;
}

//Check hours param
if (!checkHoursField(cronParams[2])) {
return false;
}

//Check day-of-month param
if (!checkDayOfMonthField(cronParams[3])) {
return false;
}

//Check months param
if (!checkMonthsField(cronParams[4])) {
return false;
}

//Check day-of-week param
if (!checkDayOfWeekField(cronParams[5])) {
return false;
}

//Check year param
if (cronParams.length == 7) {
if (!checkYearField(cronParams[6])) {
return false;
}
}

return true;
} else {
return false;
}
}

function checkSecondsField(secondsField) {
return checkField(secondsField, 0, 59);
}


function checkField(secondsField, minimal, maximal) {
if (secondsField.indexOf("-") > -1 ) {
var startValue = secondsField.substring(0, secondsField.indexOf( "-" ));
var endValue = secondsField.substring(secondsField.indexOf( "-" ) + 1);

if (!(checkIntValue(startValue, minimal, maximal, true) && checkIntValue(endValue, minimal, maximal, true))) {
return false;
}
try {
var startVal = parseInt(startValue, 10);
var endVal = parseInt(endValue, 10);

return endVal > startVal;
} catch (e) {
return false;
}
} else if (secondsField.indexOf(",") > -1) {
return checkListField(secondsField, minimal, maximal);
} else if (secondsField.indexOf( "/" ) > -1) {
return checkIncrementField( secondsField, minimal, maximal );
} else if (secondsField.indexOf( "*" ) != -1) {
return true;
} else {
return checkIntValue(secondsField, minimal, maximal);
}
}

function checkIntValue(value, minimal, maximal, checkExtremity) {
try {
var val = parseInt(value, 10);
//判断是否为整数
if (value == val) {
if (checkExtremity) {
if (val < minimal || val > maximal) {
return false;
}
}

return true;
}

return false;
} catch (e) {
return false;
}
}

function checkMinutesField(minutesField) {
return checkField(minutesField, 0, 59);
}

function checkHoursField(hoursField) {
return checkField(hoursField, 0, 23);
}

function checkDayOfMonthField(dayOfMonthField) {
if (dayOfMonthField == "?") {
return true;
}

if (dayOfMonthField.indexOf("L") >= 0) {
return checkFieldWithLetter(dayOfMonthField, "L", 1, 7, -1, -1);
} else if ( dayOfMonthField.indexOf("W") >= 0) {
return checkFieldWithLetter(dayOfMonthField, "W", 1, 31, -1, -1);
} else if (dayOfMonthField.indexOf("C") >= 0) {
return checkFieldWithLetter(dayOfMonthField, "C", 1, 31, -1, -1);
} else {
return checkField( dayOfMonthField, 1, 31 );
}
}


function checkMonthsField(monthsField) {
/* monthsField = StringUtils.replace( monthsField, "JAN", "1" );
monthsField = StringUtils.replace( monthsField, "FEB", "2" );
monthsField = StringUtils.replace( monthsField, "MAR", "3" );
monthsField = StringUtils.replace( monthsField, "APR", "4" );
monthsField = StringUtils.replace( monthsField, "MAY", "5" );
monthsField = StringUtils.replace( monthsField, "JUN", "6" );
monthsField = StringUtils.replace( monthsField, "JUL", "7" );
monthsField = StringUtils.replace( monthsField, "AUG", "8" );
monthsField = StringUtils.replace( monthsField, "SEP", "9" );
monthsField = StringUtils.replace( monthsField, "OCT", "10" );
monthsField = StringUtils.replace( monthsField, "NOV", "11" );
monthsField = StringUtils.replace( monthsField, "DEC", "12" );*/

monthsField.replace("JAN", "1");
monthsField.replace("FEB", "2");
monthsField.replace("MAR", "3");
monthsField.replace("APR", "4");
monthsField.replace("MAY", "5");
monthsField.replace("JUN", "6");
monthsField.replace("JUL", "7");
monthsField.replace("AUG", "8");
monthsField.replace("SEP", "9");
monthsField.replace("OCT", "10");
monthsField.replace("NOV", "11");
monthsField.replace("DEC", "12");

return checkField(monthsField, 1, 31);
}

function checkDayOfWeekField(dayOfWeekField) {
/* dayOfWeekField = StringUtils.replace( dayOfWeekField, "SUN", "1" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "MON", "2" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "TUE", "3" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "WED", "4" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "THU", "5" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "FRI", "6" );
dayOfWeekField = StringUtils.replace( dayOfWeekField, "SAT", "7" );*/

dayOfWeekField.replace("SUN", "1" );
dayOfWeekField.replace("MON", "2" );
dayOfWeekField.replace("TUE", "3" );
dayOfWeekField.replace("WED", "4" );
dayOfWeekField.replace("THU", "5" );
dayOfWeekField.replace("FRI", "6" );
dayOfWeekField.replace("SAT", "7" );

if (dayOfWeekField == "?") {
return true;
}

if (dayOfWeekField.indexOf("L") >= 0) {
return checkFieldWithLetter(dayOfWeekField, "L", 1, 7, -1, -1);
} else if (dayOfWeekField.indexOf("C") >= 0) {
return checkFieldWithLetter(dayOfWeekField, "C", 1, 7, -1, -1);
} else if (dayOfWeekField.indexOf("#") >= 0) {
return checkFieldWithLetter(dayOfWeekField, "#", 1, 7, 1, 5);
} else {
return checkField(dayOfWeekField, 1, 7);
}
}

function checkYearField(yearField) {
return checkField(yearField, 1970, 2099);
}


function checkFieldWithLetter(value, letter, minimalBefore, maximalBefore,
minimalAfter, maximalAfter) {
var canBeAlone = false;
var canHaveIntBefore = false;
var canHaveIntAfter = false;
var mustHaveIntBefore = false;
var mustHaveIntAfter = false;

if (letter == "L") {
canBeAlone = true;
canHaveIntBefore = true;
canHaveIntAfter = false;
mustHaveIntBefore = false;
mustHaveIntAfter = false;
}
if (letter == "W" || letter == "C") {
canBeAlone = false;
canHaveIntBefore = true;
canHaveIntAfter = false;
mustHaveIntBefore = true;
mustHaveIntAfter = false;
}
if (letter == "#") {
canBeAlone = false;
canHaveIntBefore = true;
canHaveIntAfter = true;
mustHaveIntBefore = true;
mustHaveIntAfter = true;
}

var beforeLetter = "";
var afterLetter = "";

if (value.indexOf(letter) >= 0 ) {
beforeLetter = value.substring( 0, value.indexOf(letter));
}

if (!value.endsWith(letter)) {
afterLetter = value.substring( value.indexOf( letter ) + 1 );
}

if (value.indexOf(letter) >= 0) {
if (letter == value) {
return canBeAlone;
}

if (canHaveIntBefore) {
if (mustHaveIntBefore && beforeLetter.length == 0) {
return false;
}

if (!checkIntValue(beforeLetter, minimalBefore, maximalBefore, true)){
return false;
}
} else {
if (beforeLetter.length > 0 ) {
return false;
}
}

if (canHaveIntAfter) {
if ( mustHaveIntAfter && afterLetter.length == 0 ) {
return false;
}

if (!checkIntValue(afterLetter, minimalAfter, maximalAfter, true)) {
return false;
}
} else {
if (afterLetter.length > 0) {
return false;
}
}
}

return true;
}

/* function checkIntValue(value, minimal, maximal) {
return checkIntValue(value, minimal, maximal, true);
} */

function checkIncrementField(value, minimal, maximal) {
var start = value.substring(0, value.indexOf("/"));

var increment = value.substring(value.indexOf("/") + 1);

if (!("*" == start)) {
return checkIntValue(start, minimal, maximal, true) && checkIntValue(increment, minimal, maximal, false);
} else {
return checkIntValue(increment, minimal, maximal, true);
}
}



function checkListField(value, minimal, maximal ) {
var st = value.split(",");

var values = new Array(st.length);

for(var j = 0; j < st.length; j++) {
values[j] = st[j];
}

var previousValue = -1;

for (var i= 0; i < values.length; i++) {
var currentValue = values[i];

if (!checkIntValue(currentValue, minimal, maximal, true)) {
return false;
}

try {
var val = parseInt(currentValue, 10);

if (val <= previousValue) {
return false;
} else {
previousValue = val;
}
} catch (e) {
// we have always an int
}
}

return true;
}


原文件见附件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值