这篇文章主要介绍了详解Javascript判断Crontab表达式是否合法的相关资料,需要的朋友可以参考下
Javascript判断Crontab表达式是否合法
这段时间在做Quartz任务调度,使用的Crontab表达式实现的。Crontab由前端页面输入,作为参数穿入后台。
虽然Quartz具有校验Crontab表达式的方法,如下:
boolean cronExpressionFlag = CronExpression.isValidExpression(crontab);
但是我一直想在前端直接验证,即不需要通过异步的方式向后台获取验证结果,找了好久,发现没有现成的框架可以使用,于是自己根据网上搜索到的资料,写了这个js脚本。
这个脚本目前对日和星期的判断还有点小问题,不过不影响使用。
以后如果有时间,继续完善这个脚本,废话不多说了,上代码:
function cronValidate() { var cron = $("#cron").val(); var result = CronExpressionValidator.validateCronExpression(cron); if(result == true){ alert("格式正确"); } else{ alert("格式错误"); } return CronExpressionValidator.validateCronExpression(cron); } function CronExpressionValidator() { } CronExpressionValidator.validateCronExpression = function(value) { var results = true; if (value == null || value.length == 0) { return false; } // split and test length var expressionArray = value.split(" "); var len = expressionArray.length; if ((len != 6) && (len != 7)) { return false; } // check only one question mark var match = value.match(/\?/g); if (match != null && match.length > 1) { return false; } // check only one question mark var dayOfTheMonthWildcard = ""; // if appropriate length test parts // [0] Seconds 0-59 , - * / if (CronExpressionValidator.isNotWildCard(expressionArray[0], /[\*]/gi)) { if (!CronExpressionValidator.segmentValidator("([0-9\\\\,-\\/])", expressionArray[0], [0, 59], "seconds")) { return false; } } // [1] Minutes 0-59 , - * / if (CronExpressionValidator.isNotWildCard(expressionArray[1], /[\*]/gi)) { if (!CronExpressionValidator.segmentValidator("([0-9\\\\,-\\/])", expressionArray[1], [0, 59], "minutes")) { return false; } } // [2] Hours 0-23 , - * / if (CronExpressionValidator.isNotWildCard(expressionArray[2], /[\*]/gi)) { if (!CronExpressionValidator.segmentValidator("([0-9\\\\,-\\/])", expressionArray[2], [0, 23], "hours")) { return false; } } // [3] Day of month 1-31 , - * ? / L W C if (CronExpressionValidator.isNotWildCard(expressionArray[3], /[\*\?]/gi)) { if (!CronExpressionValidator.segmentValidator("([0-9LWC\\\\,-\\/])", expressionArray[3], [1, 31], "days of the month")) { return false; } } else { dayOfTheMonthWildcard = expressionArray[3]; } // [4] Month 1-12 or JAN-DEC , - * / if (CronExpressionValidator.isNotWildCard(expressionArray[4], /[\*]/gi)) { expressionArray[4] = CronExpressionValidator.convertMonthsToInteger(expressionArray[4]); if (!CronExpressionValidator.segmentValidator("([0-9\\\\,-\\/])", expressionArray[4], [1, 12], "months")) { return false; } } // [5] Day of week 1-7 or SUN-SAT , - * ? / L C # if (CronExpressionValidator.isNotWildCard(expressionArray[5], /[\*\?]/gi)) { expressionArray[5] = CronExpressionValidator.convertDaysToInteger(expressionArray[5]); if (!CronExpressionValidator.segmentValidator("([0-9LC#\\\\,-\\/])", expressionArray[5], [1, 7], "days of the week")) { return false; } } else { if (dayOfTheMonthWildcard == String(expressionArray[5])) { return false; } } // [6] Year empty or 1970-2099 , - * / if (len == 7) { if (CronExpressionValidator.isNotWildCard(expressionArray[6], /[\*]/gi)) { if (!CronExpressionValidator.segmentValidator("([0-9\\\\,-\\/])", expressionArray[6], [1970, 2099], "years")) { return false; } } } return true; } // ---------------------------------- // isNotWildcard 静态方法; // ---------------------------------- CronExpressionValidator.isNotWildCard = function(value, expression) { var match = value.match(expression); return (match == null || match.length == 0) ? true : false; } // ---------------------------------- // convertDaysToInteger 静态方法; // ---------------------------------- CronExpressionValidator.convertDaysToInteger = function(value) { var v = value; v = v.replace(/SUN/gi, "1"); v = v.replace(/MON/gi, "2"); v = v.replace(/TUE/gi, "3"); v = v.replace(/WED/gi, "4"); v = v.replace(/THU/gi, "5"); v = v.replace(/FRI/gi, "6"); v = v.replace(/SAT/gi, "7"); return v; } // ---------------------------------- // convertMonthsToInteger 静态方法; // ---------------------------------- CronExpressionValidator.convertMonthsToInteger = function(value) { var v = value; v = v.replace(/JAN/gi, "1"); v = v.replace(/FEB/gi, "2"); v = v.replace(/MAR/gi, "3"); v = v.replace(/APR/gi, "4"); v = v.replace(/MAY/gi, "5"); v = v.replace(/JUN/gi, "6"); v = v.replace(/JUL/gi, "7"); v = v.replace(/AUG/gi, "8"); v = v.replace(/SEP/gi, "9"); v = v.replace(/OCT/gi, "10"); v = v.replace(/NOV/gi, "11"); v = v.replace(/DEC/gi, "12"); return v; } // ---------------------------------- // segmentValidator 静态方法; // ---------------------------------- CronExpressionValidator.segmentValidator = function(expression, value, range, segmentName) { var v = value; var numbers = new Array(); // first, check for any improper segments var reg = new RegExp(expression, "gi"); if (!reg.test(v)) { return false; } // check duplicate types // check only one L var dupMatch = value.match(/L/gi); if (dupMatch != null && dupMatch.length > 1) { return false; } // look through the segments // break up segments on ',' // check for special cases L,W,C,/,#,- var split = v.split(","); var i = -1; var l = split.length; var match; while (++i < l) { // set vars var checkSegment = split[i]; var n; var pattern = /(\w*)/; match = pattern.exec(checkSegment); // if just number pattern = /(\w*)\-?\d+(\w*)/; match = pattern.exec(checkSegment); if (match && match[0] == checkSegment && checkSegment.indexOf("L") == -1 && checkSegment.indexOf("l") == -1 && checkSegment.indexOf("C") == -1 && checkSegment.indexOf("c") == -1 && checkSegment.indexOf("W") == -1 && checkSegment.indexOf("w") == -1 && checkSegment.indexOf("/") == -1 && (checkSegment.indexOf("-") == -1 || checkSegment .indexOf("-") == 0) && checkSegment.indexOf("#") == -1) { n = match[0]; if (n && !(isNaN(n))) numbers.push(n); else if (match[0] == "0") numbers.push(n); continue; } // includes L, C, or w pattern = /(\w*)L|C|W(\w*)/i; match = pattern.exec(checkSegment); if (match && match[0] != "" && (checkSegment.indexOf("L") > -1 || checkSegment.indexOf("l") > -1 || checkSegment.indexOf("C") > -1 || checkSegment.indexOf("c") > -1 || checkSegment.indexOf("W") > -1 || checkSegment .indexOf("w") > -1)) { // check just l or L if (checkSegment == "L" || checkSegment == "l") continue; pattern = /(\w*)\d+(l|c|w)?(\w*)/i; match = pattern.exec(checkSegment); // if something before or after if (!match || match[0] != checkSegment) { continue; } // get the number var numCheck = match[0]; numCheck = numCheck.replace(/(l|c|w)/ig, ""); n = Number(numCheck); if (n && !(isNaN(n))) numbers.push(n); else if (match[0] == "0") numbers.push(n); continue; } var numberSplit; // includes / if (checkSegment.indexOf("/") > -1) { // take first # numberSplit = checkSegment.split("/"); if (numberSplit.length != 2) { continue; } else { n = numberSplit[0]; if (n && !(isNaN(n))) numbers.push(n); else if (numberSplit[0] == "0") numbers.push(n); continue; } } // includes # if (checkSegment.indexOf("#") > -1) { // take first # numberSplit = checkSegment.split("#"); if (numberSplit.length != 2) { continue; } else { n = numberSplit[0]; if (n && !(isNaN(n))) numbers.push(n); else if (numberSplit[0] == "0") numbers.push(n); continue; } } // includes - if (checkSegment.indexOf("-") > 0) { // take both # numberSplit = checkSegment.split("-"); if (numberSplit.length != 2) { continue; } else if (Number(numberSplit[0]) > Number(numberSplit[1])) { continue; } else { n = numberSplit[0]; if (n && !(isNaN(n))) numbers.push(n); else if (numberSplit[0] == "0") numbers.push(n); n = numberSplit[1]; if (n && !(isNaN(n))) numbers.push(n); else if (numberSplit[1] == "0") numbers.push(n); continue; } } } // lastly, check that all the found numbers are in range i = -1; l = numbers.length; if (l == 0) return false; while (++i < l) { // alert(numbers[i]); if (numbers[i] < range[0] || numbers[i] > range[1]) { return false; } } return true; }
以上是详解Javascript判断Crontab表达式是否合法的示例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境