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; 
  } 

읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기