一直想用正则表达式写一个CronExpression的验证代码,但由于JavaScript水平有限,也查了相关资料,觉得克龙表达式,的正则表达式不容易写。
所以根据CronExpressionValidator类的思路,改写了一个Cron Expression Validator,这样在做验证就比较方便了。
/** * Validates a cron expression. * * @param cronExpression The expression to validate * @return True is expression is valid */ function cronValidate(cronExpression ){ //alert("校验函数的开始!"); 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; }
这样在ext中只需指定自定义的验证函数,就可以了
{ id:'custom', title:'自定义', layout:'form', name:'custom', defaults: {width: 230}, items: [{ xtype : 'textfield', fieldLabel : '克龙表达式', name : 'fcronexp', validator: cronValidate }] } ] },