챗지피티 너마저....
주민등록번호 앞자리의 날짜 유효성과 뒷자리 성별 번호가 연도에 맞는지까지 함께 검사하면서
보다 깐깐하게 주민등록번호의 유효성을 검사해보자!
모든 자리는 기본적으로 숫자로 구성되어 있는 문자열
2번과 3번 조건은 정규식으로,
4번 조건 (1번과 연동)은 함수로 구현했다.
대시 없는 경우
const regex = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{7}$/
대시 있는 경우
(ex. 030412-3xxxxxx
)
const regex = /^\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[-]\d{7}$/
^
: 문자열의 시작\d
: 숫자{2}
: 바로 앞의 표현식이 두 번 반복되어야 함. 여기서는 /d{2} 니까 두자리 숫자(0[1-9]|1[0-2])
: 01~09 또는 10~12의 두 자리 숫자(0[1-9]|[1-2][0-9]|3[0-1])
: 01~09 또는 10~29 또는 30, 31 중 하나의 두 자리 숫자[-]
: 대시가 포함되어야 함.\d{7}
: 7자리 숫자$
: 문자열의 끝const TODAY_YEAR = parseInt(new Date().getFullYear().toString().substr(-2));
new Date()
: 현재 날짜 가져오기getFullyear()
: date 타입에서 연도를 반환toString()
: date 타입을 string 으로 변경 (substr() 연산을 위해)substr(-2)
: 문자열의 끝 두자리를 가져온다parseInt
: 문자열로 반환된걸 숫자로 변경 (추후 비교 연산해야하므로) function getIsRegistFieldRight(registNum: string) {
if(registNum.length !== 13) // 대시 있는경우 14로 변경
return false;
// 연도에 해당하는 숫자와 성별에 해당하는 숫자 비교
const yearNum = parseInt(registNum.slice(0, 2));
const sexNum = registNum.slice(6); // 대시 있는경우 7로 변경
if (sexNum === '1' || sexNum === '2') {
if (yearNum < TODAY_YEAR) return false;
} else if (sexNum === '3' || sexNum === '4') {
if (yearNum > TODAY_YEAR) return false;
} else return false;
// 월과 일에 해당하는 숫자 조건 검사 (정규식으로)
if (!regex.test(registNum)) return false;
return true;
}
true
false
로 반환한다문자열.test(정규식)