이 글에서는 생년월일을 여러 부분으로 나누어 생년월일 인증을 구현하는 전체 과정을 단계별로 소개합니다. 생년월일 정규식에 관심 있는 친구들은 참고하시면 됩니다
폼 검증에서 생년월일을 확인하기 위해 정규식을 자주 사용합니다. 이 문서에서는 생년월일을 여러 부분으로 나누고 생년월일 확인을 구현하는 전체 프로세스를 단계별로 소개합니다. 이 글의 내용을 이해한 후에는 정규식 작성에 대한 더 깊은 이해와 더 강한 자신감을 갖게 될 것이라고 믿습니다.
2018-06-15 형식의 생년월일을 연, 월, 일의 세 가지 구성 요소로 나누고 각각 해당하는 규칙을 작성합니다.
먼저 연도 정규 표현식의 규칙 정의를 제공합니다.
연도는 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"));
먼저 월 정규식의 규칙 정의를 제공합니다.
월 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"));
먼저 날짜 정규 표현식의 규칙 정의를 제공합니다.
날짜는 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"));
위의 연, 월, 일 정규식에 대해 생년월일 정규식은 다음과 같이 구성됩니다.
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월의 일수입니다.
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; }
위 내용은 제가 모든 사람을 위해 편집한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.
관련 기사:
30분 안에 Reverse Ajax를 빠르게 마스터하세요
위 내용은 생년월일 정규식을 구현하는 JavaScript 단계의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!