最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Javascript判斷Crontab表達式是否合法

 更新時間:2017年03月18日 10:54:29   投稿:lqh  
這篇文章主要介紹了詳解Javascript判斷Crontab表達式是否合法的相關(guān)資料,需要的朋友可以參考下

Javascript判斷Crontab表達式是否合法

這段時間在做Quartz任務(wù)調(diào)度,使用的Crontab表達式實現(xiàn)的。Crontab由前端頁面輸入,作為參數(shù)穿入后臺。
雖然Quartz具有校驗Crontab表達式的方法,如下:

boolean cronExpressionFlag = CronExpression.isValidExpression(crontab);

但是我一直想在前端直接驗證,即不需要通過異步的方式向后臺獲取驗證結(jié)果,找了好久,發(fā)現(xiàn)沒有現(xiàn)成的框架可以使用,于是自己根據(jù)網(wǎng)上搜索到的資料,寫了這個js腳本。

這個腳本目前對日和星期的判斷還有點小問題,不過不影響使用。

以后如果有時間,繼續(xù)完善這個腳本,廢話不多說了,上代碼:

 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 靜態(tài)方法; 
  // ---------------------------------- 
  CronExpressionValidator.isNotWildCard = function(value, expression) { 
    var match = value.match(expression); 
    return (match == null || match.length == 0) ? true : false; 
  } 

  // ---------------------------------- 
  // convertDaysToInteger 靜態(tài)方法; 
  // ---------------------------------- 
  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 靜態(tài)方法; 
  // ---------------------------------- 
  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 靜態(tài)方法; 
  // ---------------------------------- 
  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; 
  } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

您可能感興趣的文章:

相關(guān)文章

  • java?并發(fā)線程個數(shù)的如何確定

    java?并發(fā)線程個數(shù)的如何確定

    這篇文章主要介紹了java?并發(fā)線程個數(shù)的如何確定,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Windows10安裝IDEA 2020.1.2的方法步驟

    Windows10安裝IDEA 2020.1.2的方法步驟

    這篇文章主要介紹了Windows10安裝IDEA 2020.1.2的方法步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • JSON.toJSONString()方法在Java中的使用方法及應用場景

    JSON.toJSONString()方法在Java中的使用方法及應用場景

    這篇文章主要給大家介紹了關(guān)于JSON.toJSONString()方法在Java中的使用方法及應用場景,JSON.toJSONString是將對象轉(zhuǎn)化為Json字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • mybatis-plus 擴展批量新增的實現(xiàn)

    mybatis-plus 擴展批量新增的實現(xiàn)

    本文主要介紹了mybatis-plus 擴展批量新增的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • java基于swing實現(xiàn)的五子棋游戲代碼

    java基于swing實現(xiàn)的五子棋游戲代碼

    這篇文章主要介紹了java基于swing實現(xiàn)的五子棋游戲代碼,主要涉及圖形界面與數(shù)組的用法,有不錯的參考借鑒價值,需要的朋友可以參考下
    2014-11-11
  • Java實現(xiàn)的進制轉(zhuǎn)換工具類完整示例

    Java實現(xiàn)的進制轉(zhuǎn)換工具類完整示例

    這篇文章主要介紹了Java實現(xiàn)的進制轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了Java實現(xiàn)二進制、十六進制、字符串、數(shù)組等相關(guān)轉(zhuǎn)換操作技巧,需要的朋友可以參考下
    2018-07-07
  • IDEA項目打包的幾種方式總結(jié)

    IDEA項目打包的幾種方式總結(jié)

    這篇文章主要介紹了IDEA項目打包的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java實現(xiàn)順序表的增刪查改功能

    Java實現(xiàn)順序表的增刪查改功能

    這篇文章主要介紹了Java實現(xiàn)順序表的增刪查改功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java實現(xiàn)二叉樹遍歷的三種方式

    java實現(xiàn)二叉樹遍歷的三種方式

    這篇文章主要為大家詳細介紹了java實現(xiàn)二叉樹遍歷的三種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題

    解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題

    這篇文章主要介紹了解決mybatis 數(shù)據(jù)庫date 與 java中Date類型映射問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來吧
    2020-11-11

最新評論

乐山市| 永安市| 江口县| 汝城县| 齐河县| 阿巴嘎旗| 涿州市| 襄城县| 岳普湖县| 洪洞县| 衡山县| 田阳县| 乐昌市| 开封市| 镇赉县| 治县。| 偏关县| 凤翔县| 南陵县| 中卫市| 广汉市| 新平| 双流县| 海晏县| 鱼台县| 襄汾县| 金门县| 三穗县| 平定县| 右玉县| 淳安县| 炎陵县| 临武县| 新邵县| 杭州市| 泊头市| 克什克腾旗| 阿合奇县| 司法| 博兴县| 无为县|