>  기사  >  웹 프론트엔드  >  생년월일 정규식을 구현하는 JavaScript 단계

생년월일 정규식을 구현하는 JavaScript 단계

亚连
亚连원래의
2018-05-26 16:35:281892검색

이 글에서는 생년월일을 여러 부분으로 나누어 생년월일 인증을 구현하는 전체 과정을 단계별로 소개합니다. 생년월일 정규식에 관심 있는 친구들은 참고하시면 됩니다

간략한 소개

폼 검증에서 생년월일을 확인하기 위해 정규식을 자주 사용합니다. 이 문서에서는 생년월일을 여러 부분으로 나누고 생년월일 확인을 구현하는 전체 프로세스를 단계별로 소개합니다. 이 글의 내용을 이해한 후에는 정규식 작성에 대한 더 깊은 이해와 더 강한 자신감을 갖게 될 것이라고 믿습니다.


2018-06-15 형식의 생년월일을 연, 월, 일의 세 가지 구성 요소로 나누고 각각 해당하는 규칙을 작성합니다.

1년 정규

먼저 연도 정규 표현식의 규칙 정의를 제공합니다.

  • 연도는 4자리 숫자로 구성됩니다.

  • 19와 20으로 시작하는 연도만 허용

위 규칙에 따르면 올해의 정규식을 작성하는 것은 쉽습니다.

var pattern = /^(19|20)\d{2}$/;
//输出 true
console.log(pattern.test("2008"));


여기서//두 개의 슬래시와 그 사이의 문자는 정규식 리터럴의 정의입니다. ^는 문자열의 시작과 일치함을 의미하고, $는 문자열의 끝과 일치함을 의미하며, ^(19|20)은 19 또는 20으로 시작하는 문자열과 일치함을 의미하며, 한 쌍의 괄호는 여러 항목을 하나의 단위로 결합하는 데 사용됩니다. {2} 이는 임의의 ASCII 숫자가 2번 일치함을 의미하고, d는 [0-9]와 동일하며, {2}는 이전 항목과 2번 일치함을 의미합니다.

위 정규 표현식은 1900년부터 2099년까지의 연도와 일치할 수 있습니다. 연도 범위를 제한하려면 다음 규칙을 추가하세요.

  • 연도는 1920년에 시작됩니다.

  • 연도는 2018년에 끝납니다.

위 규칙에 따라 정규식을 다음과 같이 변경합니다.

var pattern = /^(19[2-9]\d{1})|(20((0[0-9])|(1[0-8])))$/;
//输出 false
console.log(pattern.test("1916"));
//输出 true
console.log(pattern.test("2008"));
//输出 false
console.log(pattern.test("2022"));


2 Month 정규식

먼저 월 정규식의 규칙 정의를 제공합니다.

  • 월 OK 월이 1~12일 경우

  • 월이 1~9일 경우 앞에 0

을 추가하면 됩니다. 위의 규칙에 따라 다음과 같은 일반 규칙과 간단한 사항을 따릅니다. 테스트가 제공됩니다:

var pattern = /^((0?[1-9])|(1[0-2]))$/;
//输出 false
console.log(pattern.test("19"));
//输出 true
console.log(pattern.test("02"));
//输出 true
console.log(pattern.test("2"));
//输出 true
console.log(pattern.test("11"));

3 날짜 일반 규칙

먼저 날짜 정규 표현식의 규칙 정의를 제공합니다.

  • 날짜는 1-31

  • 일 수 있습니다. 1-9이면 앞에 0을 추가해도 됩니다

위의 규칙에 따라 다음 정규식과 간단한 테스트를 생각해 보세요.

var pattern = /^((0?[1-9])|([1-2][0-9])|30|31)$/;
//输出 false
console.log(pattern.test("32"));
//输出 true
console.log(pattern.test("02"));
//输出 true
console.log(pattern.test("2"));

4 조합 확인

위의 연, 월, 일 정규식에 대해 생년월일 정규식은 다음과 같이 구성됩니다.

var pattern = /^((19[2-9]\d{1})|(20((0[0-9])|(1[0-8]))))\-((0?[1-9])|(1[0-2]))\-((0?[1-9])|([1-2][0-9])|30|31)$/;
//输出 true
console.log(pattern.test("1923-3-18"));
//输出 true
console.log(pattern.test("1923-4-31"));
//输出 true
console.log(pattern.test("1923-2-29"));
//输出 true
console.log(pattern.test("2016-2-29"));

위의 테스트 결과를 보면 위의 정규 검증이 완벽하지 않다는 것을 알 수 있습니다. 2월, 4월, 6월, 9월, 11월의 일수입니다.

5 개선

4단계의 질문에 따라 다음과 같이 제한 규칙을 추가합니다.

  • 4월, 6월, 9월, 11월에는 31일이 없습니다.

  • 2월은 28일입니다. 평년

  • 2월은 29일로 구성된 윤년

평년의 윤년 판단:

4로 나누어 떨어지는 해는 윤년, 4로 나누어 떨어지지 않는 해는 윤년 4는 평범한 해입니다. 그러나 만 100년이 되는 해는 400으로 나누어 떨어지는 경우에만 윤년이고, 그렇지 않으면 평년이다.

새로운 규칙과 지침에 따라 다음과 같은 정규 함수와 테스트가 제공됩니다.

var checkBirth = function (val) {
  var pattern = /^((?:19[2-9]\d{1})|(?:20(?:(?:0[0-9])|(?:1[0-8]))))\-((?:0?[1-9])|(?:1[0-2]))\-((?:0?[1-9])|(?:[1-2][0-9])|30|31)$/;
  var result = val.match(pattern);
  if(result != null) {
    var iYear = parseInt(result[1]);
    var month = result[2];
    var date = result[3];
    if(/^((0?[469])|11)$/.test(month) && date == '31') {
      return false;
    } else if(parseInt(month) == 2){
      if((iYear % 4 ==0 && iYear % 100 != 0) || (iYear % 400 == 0)) {
        if(date == '29') {
          return true;
        }
      }
      if(parseInt(date) > 28) {
        return false;
      }
    }
    return true;
  }
  return false;
}
//输出 true
console.log(checkBirth("1923-3-18"));
//输出 false 4月份没有31日
console.log(checkBirth("1923-4-31"));
//输出 false 平年
console.log(checkBirth("1923-2-29"));
//输出 true 闰年
console.log(checkBirth("2016-2-29"));

위 정규식은 String의 match() 메서드를 사용합니다. 이 메서드의 유일한 매개 변수는 정규식입니다. 반환된 것은 일치하는 결과로 구성된 배열입니다. 배열의 첫 번째 요소는 일치하는 문자열이고 나머지 요소는 정규식에서 괄호로 묶인 하위 표현식입니다. (:?...) 형태가 여러번 나타나는데, 이 방법은 항목을 하나의 단위로만 그룹화하고 그룹에 일치하는 문자를 기억하지 않는다는 의미입니다. 이 방법은 후속 비교를 위해 정규 매칭 순서대로 연, 월, 일 항목을 추출하는 데 사용됩니다.

위의 분석과 테스트를 바탕으로 연, 월, 일의 일반적인 일반 결정을 구현했을 뿐만 아니라 2, 4, 6, 9, 11월과 같은 날짜 범위 및 특별 월일 처리도 구현했습니다. .테스트 결과가 우리가 설정한 목표 수준에 도달했습니다.

위의 설명과 분석을 바탕으로 특정 시나리오의 프로젝트 요구 사항에 맞게 해당 제한 규칙을 조정할 수 있습니다.

Extension

V2EX 네티즌 xiangyuecn의 의견에 따르면 위의 checkBirth 로직 코드는 너무 과해서 실제로는 약간 낮습니다. 이제 위의 코드를 다음과 같이 업데이트하세요.

var checkBirth = function (val) {
  var pattern = /^((19[2-9]\d{1})|(20((0[0-9])|(1[0-8]))))\-((0?[1-9])|(1[0-2]))\-((0?[1-9])|([1-2][0-9])|30|31)$/;
  if(pattern.test(val)) {
    var date = new Date(val);
    var month = val.substring(val.indexOf("-")+1,val.lastIndexOf("-"));
    return date && (date.getMonth()+1 == parseInt(month));
  }
  return false;
}

위 내용은 제가 모든 사람을 위해 편집한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

Ajax 전역 로딩 상자 구성(로딩 효과)

30분 안에 Reverse Ajax를 빠르게 마스터하세요

Ajax는 스마트 프롬프트 검색 기능을 구현합니다

위 내용은 생년월일 정규식을 구현하는 JavaScript 단계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.