'java regular expression 주민번호'에 해당되는 글 1건



안녕하세요. 제임스 입니다. 


이번 포스팅에서는 정규표현식을 이용한 주민등록번호 패턴을 만들어 보겠습니다. 



■ 정규표현식으로 주민등록번호 패턴 만들기


주민등록번호 구성은 아래와 같습니다. 


예) 123456 - 1234567


◎ 첫 6자리

12 ▶ 출생년도 마지막 두자리

34 ▶ 출생 월

56 ▶ 출생 일



◎ 마지막 7자리

1 ▶ 성별 (1: 남자, 2: 여자, 3: 2000년 이후 출생자 남자, 4: 2000년 이후 출생자 여자)

2345 ▶ 지역코드

6 ▶ 출생신고지 기준 접수 순번

7 ▶ 검증번호 (앞 12 자리 숫자를 특정 공식에 대입 시 딱 하나의 숫자만 나올 수 있음)



주민등록 번호는 위와 같은 구성으로 만들어 질 수 있습니다. 


이번 포스팅에서는 각각의 모든 자리의 의미를 파악하고 작업 하는 것이 아니라 간편하게 입력 받을 수 있도록 만들어 보겠습니다. 디테일링은 각자 해보시기 바라겠습니다. (혹, 어렵다면 댓글로 남겨 주세요 ㅎㅎ)


이제 패턴 만들기를 시작해 보겠습니다. 




■ 앞 6자리 패턴 만들기


▶ 출생년도 


^\\d{2}

또는 

^[0-9]{2}


위 두가지 표현식 모두 동일한 의미 입니다. 0 ~ 9 사이 두자릿수 숫자 허용



▶ 출생 월 


^\\d{2}(0[1-9]|1[0-2])


앞자리가 0일때 뒷자리는 1 ~ 9 까지 허용. 즉, 01 ~ 09 월 까지 범위 설정

또는을 의미하는 " | " 값을 이용하여 앞자리가 1일때 뒤자리가 0 ~ 2 까지 허용 되는 값을 설정하여 전체 01월 부터 12월 까지 허용 하는 코드 추가 



▶ 출생 일 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])


앞자리가 0 ~ 2 까지 허용 될때 두번째 자리는 0 ~ 9 까지 설정하여 01 ~ 09 일까지 설정

앞자리가 1 또는 2 일때는 뒷자리를 0 ~ 9 까지 모두 허용하는 것으로 설정하여 10 ~ 29 까지 허용

앞자리가 3 일때 뒷자리는 0 또는 1만 허용 하는 것으로 설정하여 30, 31 두 숫자까지 최종 허용 하는 것으로 정의 했습니다. 


결국 01 ~ 31 까지 허용 범위가 지정 되었습니다. 




■ 뒤 7자리 패턴 만들기


▶ 성별


[1-4]

첫 자리 수를 1 ~ 4 사이로 지정 했습니다. 



▶ 나머지 6자리 숫자


[1-4][0-9]{6}

성별을 제외한 나머지 6자리는 0 ~ 9 까지 모두 허용 하며 자릿수는 6자리로 지정 했습니다. 




이제 앞뒤 패턴을 합쳐보겠습니다. 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])[1-4][0-9]{6}


뭔가 좀 아쉽죠? 일반적으로 주민등록번호 쓸때 앞 6자리 와 뒤 7자리 사이에 " - " 를 사용하는데요. 이녀석을 한번 추가해 보겠습니다. 




▶ 구분자 ( - ) 추가 


^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$


앞 6자리와 뒤 7자리 숫자를 구분하기 위한 구분자로 ( - ) 를 추가 했습니다. 




이제 이 값을 한번 테스트 해보겠습니다. 


1
String regExp = "^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|[3][01])\\-[1-4][0-9]{6}$";
cs


위와 같이 표현식을 선언 했습니다. 

앞서 작성한 주민번호 표현식입니다. 


이제 테스트 코드를 한번 보겠습니다. 


1
2
String ssn1 = "001225-4321126";
System.out.println("주민번호 1 테스트 결과 ==> " + ssn1.matches(regExp));
cs


ssn1 이라는 값이 준비한 표현식에 맞습니다. 

위 코드를 실행 하면 결과는 어떻게 나올까요? 


Results

주민번호 1 테스트 결과 ==> true



1
2
String ssn2 = "980013-1618960";
System.out.println("주민번호 2 테스트 결과 ==> " + ssn2.matches(regExp));
cs


ssn2 라는 값을 잘 보시면 월 부분이 00 으로 입력 되어 있습니다. 잘못 입력 된 값입니다. 


당연하게도 위 코드를 실행 시키면 아래와 같은 결과 값이 나옵니다. 


Results

주민번호 2 테스트 결과 ==> false



1
2
String ssn3 = "950627-7715446";
System.out.println("주민번호 3 테스트 결과 ==> " + ssn3.matches(regExp));
cs


ssn3 이라는 값의 두번째 첫 숫자가 7로 들어 왔습니다. 허용하고 있는 값은 0 ~ 4 까지 입니다. 

어떤 값이 나올지는 예상이 되시죠? 


Results

주민번호 2 테스트 결과 ==> false



사실 이 표현식도 완벽한 표현식은 아닙니다. 


예를 들어 2001년 5월 16일 생의 뒤 7자리 첫번째 숫자는 3 또는 4만 와야 하는데요.

이런 경우의 수 까지 모두 추가를 하려면 표현식이 많이 길어 지겠죠? 


하지만 지금까지 포스팅한 정규표현식 정리 내용을 보신 분들은 어쩌면!!! 당연하게도??? ㅎㅎ;; 잘 하실 수 있을꺼라 생각 됩니다. 


혹, 도전 해보시고자 하시는데 잘 안되시는 분들은 문의 남겨 주시면 도와 드리겠습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,