`
吃猫的鱼
  • 浏览: 45521 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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])) {   
            // results.push(new ValidationResult(true, baseField, "wrongFormat",   
            // validator.wrongFormatError));   
            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;   
}   
  
// ----------------------------------   
// convertDays 静态方法;   
// ----------------------------------   
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;   
}   
  
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)) {   
        //alert("reg[" + expression + "] " + v + " is not valid expression!");   
        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) {   
                // results.push(new ValidationResult(true, null, "noMatch", "The   
                // " + segmentName + " segment is invalid."));   
                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) {   
                // results.push(new ValidationResult(true, null, "noMatch", "The   
                // " + segmentName + " segment is invalid."));   
                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) {   
                // results.push(new ValidationResult(true, null, "noMatch", "The   
                // " + segmentName + " segment is invalid."));   
                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) {   
                // results.push(new ValidationResult(true, null, "noMatch", "The   
                // " + segmentName + " segment is invalid."));   
                continue;   
            } else if (Number(numberSplit[0]) > Number(numberSplit[1])) {   
                // results.push(new ValidationResult(true, null, "noMatch", "The   
                // " + segmentName + " segment is invalid."));   
                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]) {   
            //alert(numbers[i] + ' is not in the range [' + range[0] + ", "   
            //      + range[1] + "]");   
            return false;   
        }   
    }   
    return true;   
}   
  
  
function cronValidate(cronExpression) {   
    return CronExpressionValidator.validateCronExpression(cronExpression);   
}   
        }  

分享到:
评论

相关推荐

    详细简单的cron表达式校验js

    cron表达式校验,验证是否是正确的cron表达式,调用的主方法是function cronValidate(cronExpression ),有需要可以看一下

    cron表达式校验,验证是否是正确的cron表达式,调用的主方法是function cronValidate(cronExpre

    `cronValidate`函数显然是用于校验输入的字符串是否符合cron表达式的规则。 cron表达式由6或7个字段组成,每个字段代表不同的时间单位,从左到右依次为秒(可选)、分钟、小时、日期、月份中的日期、月份和星期(可...

    Cron表达式验证工具

    Cron表达式写好了,不知道是否正确,如果执行间隔很长,根本没法测试,这个工具可以帮助你,他能输出所有的执行时间,你只需自己调整参数就行了,非常简单。提醒:目前常用的两个Cron表达式在线生成网站所提供的近期...

    Cron expression 校验 js版本

    JavaScript版本的Cron表达式校验工具则为前端开发人员提供了一个方便的解决方案,可以在客户端进行定时任务配置的验证。 Cron表达式的语法结构相对复杂,由六个或七个字段组成,每个字段代表不同的时间单位,从秒到...

    应用再html、jsp上的自动生成Cron表达式

    在IT领域,尤其是在Web开发中,`Cron表达式`是一种强大的工具,用于安排周期性的任务执行。在HTML和JSP(JavaServer Pages)这样的前端和后端技术中,使用Cron表达式可以帮助开发者实现定时任务,比如定时发送邮件、...

    Linux Cron表达式解析

    Linux Cron表达式是一种在Unix和类Unix系统中用于调度任务的机制,它允许用户或系统管理员定义周期性任务的执行时间。Cron表达式由六个或七个由空格分隔的字段组成,每个字段代表一个时间维度:秒、分钟、小时、日期...

    cron-validator:验证cron表达式

    Cron验证器Cron Validator是一种实用程序,可让您在代码库中验证cron表达式,类似于所做的事情。备择方案 :它具有更多功能和配置选项来限制范围或创建配置预设。 它包含一个应该与AWS Schedule Expressions相匹配的...

    定时任务cron 解析为中文.docx

    在方法中,首先通过`Assert.hasText`和`CronExpression.isValidExpression`进行参数校验,确保输入的cron表达式有效且非空。 接下来,表达式被分割为6个部分,分别对应cron表达式的时间段:秒、分、时、日、月、...

    Cron前端生成工具

    2. **实时预览**:用户在调整时间设置时,工具会立即显示对应的Cron表达式,方便校验和理解。 3. **测试功能**:用户可以输入特定日期和时间,查看任务是否会在预期的时间点触发,以验证配置的正确性。 4. **导入...

    cronmatch:cronmatch检查日期时间是否与cron表达式匹配

    cronmatch cronmatch检查日期/时间是否与cron表达式匹配。用法match方法接受两个参数: cron表达式日期(或可以转换为日期的内容) const cronmatch = require ( 'cronmatch' )// If the minute of the current time...

    react-cron-generator:简单的react组件以生成cron表达式(材料UI)

    React时间发生器简单的react组件以生成cron表达式(Material-UI)入门软件包有助于构建Linux Scheduler cron表达式。 该项目使用material-ui data = '* * * * * * *'npm i --save @dealmeddevs/react-cron-generator...

    Cronos:功能齐全的.NET库,用于处理Cron表达式。 牢记时区,直观地处理夏时制转换

    Cronos是一个.NET库,用于解析Cron表达式并计算下一次出现。 它是设计时考虑时区,并直观地处理(又名夏令时)转换为* nix中的Cron。 请注意,该库不包含任何任务/作业计划程序,仅适用于Cron表达式。 支持带有可...

    quartz/Cron/Crontab表达式在线生成工具

    【Cron表达式详解】 Cron表达式是一种强大的时间调度机制,广泛应用于各种定时任务的配置,例如在Java中的Quartz框架。它是由七个子表达式组成的字符串,每个子表达式都代表一个时间维度(秒、分钟、小时、日期、...

    react-cron:基于react和antd完成的一个生成cron表达式的插件

    React时间概述基于react和antd完成的一个创建cron的插件。核心代码在src/cron/index.js。本地安装引用 import ReactCron from '@/cron/index.js' require ( "@/cron/index.css) class App extends React.Component {...

    详解Javascript判断Crontab表达式是否合法

    而给定的代码片段中提到了一个`CronExpressionValidator.validateCronExpression`函数,该函数似乎被用于在前端进行Crontab表达式合法性的校验。尽管它存在一些问题,比如对日期和星期的判断有误,但基本的验证逻辑...

    Cron生成器.rar

    2. **实时预览**:用户在调整参数时可以立即看到对应的Cron表达式,方便校验和理解。 3. **灵活性**:支持嵌入到网页,意味着开发者可以将其集成到自己的项目中,为用户提供定制化的定时任务设置功能。 4. **兼容性*...

    quartz表达式生成工具

    此外,CronExpBuilder可能还提供了诸如校验、解析、格式化等辅助功能,便于开发者更加便捷地处理Cron表达式。通过阅读`CronExpBuilder`源代码,我们可以深入理解其内部实现原理,提升在Quartz中的使用效率和准确性。...

    常有前端验证JS

    3. 正则表达式:使用`test()`或`match()`方法,结合正则表达式进行复杂的数据格式验证,如邮箱、电话号码、日期等。 三、`validate.js`库的功能与特性 1. 验证规则:`validate.js`可能包含多种预定义的验证规则,...

    定时自动http下载程序

    定时功能通常采用时间调度算法实现,如CRON表达式,它允许用户精确地设定任务执行的时间间隔。例如,每月、每周的特定日子、每天的某一时刻或每小时执行一次下载任务。这样的设定方式灵活多样,满足了不同用户的个性...

    ssh+extjs简单项目 spring定时任务

    2. **定义定时任务类**:创建一个包含`@Scheduled`注解的方法,该注解允许我们设置执行频率,例如cron表达式或者固定延迟。 3. **注册任务**:将定时任务类作为一个bean注入到Spring容器中,这样Spring就能自动发现...

Global site tag (gtag.js) - Google Analytics