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


이번 포스팅에서는 자바 정규표현식을 이용하여 간단한 이메일 패턴을 만들어 볼까 합니다. 


사실 완벽한 이메일 패턴을 만든다는 것은 거의 불가능? 에 가깝습니다.

왜냐하면 우리가 모르는 이메일 패턴이 도처에 깔려 있기 때문입니다. 

또한 이메일 서비스를 하는 업체마다 입력 가능한 문자열의 허용 범위가 다르기 때문에 그것들을 모두 만족 하는 이메일 패턴 정규표현식을 만들기는 거의 불가능 하다고 보시면 됩니다. 


그럼에도 불구하고 이메일 패턴을 만들어 본다고 한것은... 

우리 사이트에서 제공하고 허용하는 이메일 패턴을 만들어 보자는 의도 입니다. 

내가 만든 패턴에 부합하는 이메일 주소 형식만 허용 하겠다! 

멋지지 않나요? ^^


그럼 시작해 보겠습니다. 



■ 정규표현식으로 이메일 주소 패턴 만들기



xxxxxx@xxxx.xxx

xxxxxx@xxxx.xxx.xx


일반적으로 이메일 주소 형태는 위와 같이 @ 를 기준으로 ID 부HOST 부로 나뉩니다. 


이 ID 와 HOST 부에 적용할 이메일 주소 패턴의 형태를 정하겠습니다. 


ID 부 설정

▶ 영문 대소문자 허용

▶ 숫자 허용

 .   -  등 5가지 특문 허용


HOST 부 설정

▶ 영문 대소문자 허용

▶ 숫자 허용

▶  .  -  등 2가지 특문 허용

▶ 위 값이 최소 1개 이상 표기된 후  추가

▶ 마침표 뒤에는 영문자 대소문자 만 허용

▶ 마침표 뒤의 문자 셋은 최소 2 ~ 최대 6 자리 까지만 허용


위와 같이 패턴을 정리 했습니다. 


그럼 위 조건에 맞게 이메일 주소 패턴을 만들어 보겠습니다. 



■ ID 부 패턴 만들기 


우선 ID 부의 영문 대소문자 및 숫자 허용 하는 문자셋을 만들어 보겠습니다. 

^[a-zA-Z0-9]

너무 간단합니다. 지금껏 많이 봐오셨죠? 

정규표현식 시작은 ^ 를 붙이니 잊지 말고 챙겨 줍니다. 


이 문자셋에 위 5가지 특문을 허용 하는 것으로 해보겠습니다. 간단합니다. 

그냥 문자셋 안에 나열만 하시면 됩니다. 

^[a-zA-Z0-9._%+-]


선행 문자셋이 최소 1개 이상 와야 된다는 조건으로 문자셋 [...] 다음에 + 를 추가 해줍니다. 

^[a-zA-Z0-9._%+-]+


여기까지가 ID 부 입니다. 간단하죠 ^^



물론 뒤에 바로 @ 를 붙여하니 HOST 부 시작전 최종 모습은 아래와 같습니다. 

^[a-zA-Z0-9._%+-]+@



■ HOST 부 패턴 만들기


시작은 동일하게 영문 대소문자 및 숫자 허용 하는 것으로 지정 하겠습니다. 

[a-zA-Z0-9]


2가지 특문 허용하기 위해 문자셋 안에 나열해 주면 됩니다. 

[a-zA-Z0-9.-]


위 문자셋 중 최소 한가지 이상의 값이 나오는 것으로 지정해 줍니다. 

[a-zA-Z0-9.-]+


이제 마침표 하나 들어 와야겠죠? 자바에서는 back slash (\) 를 사용하기 위해 이스케이프 문자인 back slash를 한번 더 사용합니다. 그래서 두개와 나란히 옵니다. 

[a-zA-Z0-9.-]+\\.


마지막으로 2 ~ 6자리 영문자만 허용 하는 것을 추가 해보겠습니다. 

[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}


이제 $ 표시를 이용하여 정규표현식 마무리라른 것을 선언해주면 되겠죠? 최종 모습은 아래와 같습니다. 

[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$



이렇게 정리된 표현식을 자바 코드를 이용해서 테스트 해보겠습니다. 



1
String regExp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$";
cs


이메일 주소 패턴을 위와 같이 작성을 했습니다. 


테스트 코드은 아래와 같이 4가지 이메일 주소를 만들어 봤습니다. 


1
2
3
4
String emailAddr1 = "testMail1004@james.com";
String emailAddr2 = "testMail-1004@james.com";
String emailAddr3 = "testMail-1004@james-test.com";
String emailAddr4 = "test.Mail-1004@james-test.co.kr";
cs


1번 부터 3번까지는 쉽게 이해가 되시겠죠? 

모두 표현식에 맞는 이메일 주소 패턴입니다. 


4번의 경우  xxxx . xx . xx 라는 형식으로 들어 왔습니다. 

이 경우는 표현식 패턴에 맞는 메일 형식일까요? 


위에서 HOST 부 패턴 만들때 첫번째 문자셋 안에 마침표 ( . )를 허용 하는 것으로 작성 했습니다. 

그렇기 때문에 james-test 라는 문자열 뒤에 마침표( . )가 들어와도 문제 없습니다. 


위 값들을 아래와 같은 코드로 실행 시켜 보겠습니다. 


1
2
3
4
System.out.println("email address 1 테스트 결과 ==> " + emailAddr1.matches(regExp));
System.out.println("email address 2 테스트 결과 ==> " + emailAddr2.matches(regExp));
System.out.println("email address 3 테스트 결과 ==> " + emailAddr3.matches(regExp));
System.out.println("email address 4 테스트 결과 ==> " + emailAddr4.matches(regExp));
cs



결과는 아래와 같습니다. 


Result

email address 1 테스트 결과 ==> true

email address 2 테스트 결과 ==> true

email address 3 테스트 결과 ==> true

email address 4 테스트 결과 ==> true


모두 만들어 둔 패턴에 맞는 형식들입니다. 



하지만 문제점도 있습니다. 


1
String emailAddr5 = "test.Mail-1004@james-test..kr";
cs


위와 같이 HOST 부에 마침표 ( . ) 가 중복으로 입력되는 경우가 있을 수 있겠는데요. 

현재 만들어 둔 표현식으로는 위 코드를 실행해도 패턴에 맞는 형식으로 나옵니다. 


1
System.out.println("email address 5 테스트 결과 ==> " + emailAddr5.matches(regExp));
cs


Result

email address 5 테스트 결과 ==> true



이런 많은 경우의 수를 생각해서 추가적으로 표현식을 디테일하게 작성할 수도 있습니다. 


예를 들면 아래와 같은 이메일 주소 패턴을 만들어 사용 할 수 있습니다. 


(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])


출처: http://emailregex.com/



위 패턴을 이용하면 좀더 디테일한 이메일 주소 패턴이 될 수 있습니다. 

하지만 이 패턴 역시 완벽하진 않습니다. 


앞서 언급했듯이 수많은 형식의 이메일 주소 패턴들이 존재하고 있기 때문입니다. 



지금까지 정규표현식을 이용하여 이메일 주소 패턴을 만들어 봤습니다. 

여기서 요건에 따라 더 추가하거나 빼는 방식으로 나만의 이메일 주소 패턴을 만들어 가는 것도 좋을 것 같습니다. 



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

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

감사합니다 :D

블로그 이미지

쉬운코딩이최고

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

,