Hansel
정규표현식 본문
REGEX
정규표현식이란?
제시된 문자열을 바탕으로 정해진 패턴과 일치하는지 검사하는 문자열 처리 방법입니다.
저는 회원가입 기능에 이메일 입력 검증을 위한 정규표현식을 사용했지만 제가 사용한 정규표현식을 명확히 설명하지 못했습니다.
명확히 알고 사용하고자 해당 글을 작성합니다.
이걸 어떻게 해석하지?
저는 (알파벳+숫자 조합의 문자열)@(알파벳).(알파벳) 형식의 이메일만 통과되도록 하기 위해 정규표현식을 사용했습니다.
아래는 제가 사용한 정규표현식입니다.
"( [!#-'*+/-9=?A-Z^-~-]" +
"+(\.[!#-'*+/-9=?A-Z^-~-]+)" +
"*|\"\(\[\]!#-[^-~ \t]|(\\[\t -~]))+\")" +
"@([!#-'*+/-9=?A-Z^-~-]" +
"+(\.[!#-'*+/-9=?A-Z^-~-]+)" +
"*|\[[\t -Z^-~]*] )"
RFC 표준 형식이라는 말에 단순히 사용했고 이에 대한 피드백은 "우리가 익숙한 이메일 표현식과는 다르다." 였습니다.
학습을 하고 이해해보려 해도 무슨 말인지 모르겠습니다.
찾아보니 이는 정확한 정규표현식은 아니며 RFC 5322(Internet Message Format)에 정의된 이메일 형식을 구현한 다양한 표현식 중 하나에 불과했습니다.
기본적인 정규표현식
우선은 기본적인 정규표현식부터 알아봐야 합니다.
문자 클래스 []
정규표현식에서 사용되는 대괄호는 문자 클래스를 의미합니다.
대괄호 안에 작성된 패턴으로 우리는 문자열을 검증할 수 있습니다.
문자 클래스 안에는 어떠한 문자도 들어갈 수 있습니다.
[nts] 이라는 문자 클래스를 작성했다면 n , t, s 중 하나의 문자와의 매치를 의미하게 됩니다.
n을 입력하는 경우 [nts]라는 표현식과 일치하게 됩니다.
하지만 nt를 입력하는 경우 'n'이 일치하지만 **하나**의 문자에 대해서만 검증을 하기 때문에 표현식과는 일치하지 않게 됩니다.
문자 클래스는 문자의 범위를 표현할 때 유용하게 사용할 수 있습니다.
주로 [a-z] , [0-9] 등 알파벳이나 숫자만 포함되도록 하는 표현식을 작성할 때 사용됩니다.
문자 그룹 ()
문자 그룹은 소괄호 안의 문자를 하나의 문자로 인식합니다.
예를 들어 (nts)[0-9] 와 같은 정규표현식을 작성했다면,
nts로 시작하면서 0-9 사이의 숫자 하나만 검증에 통과합니다.
반복 {}
현재 nts의 사번은 nts + 숫자 5자리로 이루어져 있습니다.
이런 정규표현식을 만들기 위해서는 (nts) 와 [0-9]가 5번 반복되도록 해야합니다.
반복은 중괄호 {}를 통해 만들어줄 수 있습니다.
특정 문자의 뒤에 {5}가 온다면 그 문자는 **반드시** 5번 반복되어야 합니다.
범위를 지정할 수도 있습니다.
{2,5}는 1번~5번 까지의 반복을 의미합니다.
그 외에도
'*' (0번 이상 반복)
'+' (최소 1번부터 반복)
'?' (0개 혹은 1개) 등이 있습니다.
지금까지의 내용으로도 아주 간단한 이메일 정규표현식을 생성할 수 있습니다.
하지만 아직은 너무 빈약한 정규표현식 입니다.
@앞에 문자만 가능해서 숫자는 당연하고 '-' , '.' , '_' 등의 특수문자도 넣을 수 없습니다.
도메인 또한 naver.com 같이 항상 문자열 + '.' + 문자열로 끝난다는 보장이 없습니다.
대학교 이메일 계정은 'aaa.edu.kr' , 'aaa@aaa.ac.kr' 등 다양하고, 사내 이메일은 '@@@-corp.com' 으로 중간에 다른 문자열이나 특정한 기호가 포함될 수 있다는 패턴이 필요합니다.
제가 생각한 이메일에 필요한 요구사항은 다음과 같습니다.
1. 알파벳과 숫자로 시작한다.
2. '@' 직전과 직후 문자열에는 '-' , '.' 등의 기호를 포함할 수 있도록 한다.
3. 마지막으로 오는 문자열 시작에는 마침표가 반드시 포함되며 알파벳이 2-4자 까지 가능하다.
> 1번의 경우 알파벳 혹은 숫자로 시작해야합니다.
정규표현식의 시작은 '^' 로 나타낼 수 있으며 끝은 '$'로 나타낼 수 있습니다.
따라서 1번 요구사항을 위해 표현식은 ^[a-zA-Z0-9]로 시작해야합니다.
> 2번 요구사항은 시작 문자와 '@' 이전, 이후 문자열에 a-z, A-Z, 0-9, '-', '.' , '_' 등의 문자가 가능해야 합니다.
우선 알파벳과 숫자를 [a-zA-Z0-9]로 묶어주고 '.' , '_' , '-' 는 필수는 아니기 때문에 ?(0개 혹은 1개)로 조건을 걸어줍니다.
이 조합이 얼마나 반복될지 모르니 문자 그룹으로 묶어주고 아스테리스크를 사용해 반복이 가능하도록 해줘야 합니다.
그럼 ([._-]?[a-zA-Z0-9])* 이런 표현식이 생성됩니다.
만약 ._- 등의 기호를 반복 가능하도록 사용하고 싶다면 ?가 아닌 *를 사용하면 됩니다.
@ 직후에는 대부분 문자열이 오기 때문에 [a-zA-Z]([._-]?[0-9a-zA-Z])* 이런 표현식을 만들어주면 됩니다.
> 3번은 마침표가 필수이니 문자열 시작 부분에 마침표와 [a-zA-Z]를 2-3번 반복 조건을 걸어주면 됩니다.
이메일 도메인의 마지막 부분(com, net, org 등)을 TLD (TOP LEVEL DOMAIN)라 부르는데 최대 길이는 63자 이지만 대부분 2-3자라고 합니다.
완성된 이메일 정규 표현식은 다음과 같습니다.
<h4>^[a-zA-Z0-9]([._-]*[a-zA-Z0-9])*@[a-zA-Z]([._-]?[a-zA-Z0-9])*.[a-zA-Z]{2,3}$</h4>
그 외 표현식
주민번호나 전화번호는 대부분 동일한 포맷을 가지기 때문에 이 또한 정규표현식으로 검증하면 편리할 수 있습니다.
> 숫자 반복
숫자의 경우 \d{반복 횟수} 등으로 처리할 수 있습니다.
주민번호 형식인 6자리와 7자리 숫자의 조합을 검증하기 위한 정규표현식입니다.
주민번호 뒷자리의 시작은 1,2,3,4 중 하나이기 때문에 문자 그룹 내에서 '|' 를 사용해 or로 검증할 수 있으며,
문자 클래스에서 1,2,3,4 중 하나를 선택하도록 할 수도 있습니다.
> 참고
https://ccambo.blogspot.com/2014/10/regular-expression.html
https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_domain_name
https://data.iana.org/TLD/tlds-alpha-by-domain.txt
'Spring > 이것저것' 카테고리의 다른 글
스프링 @Async 비동기 문제 (0) | 2022.10.06 |
---|---|
연관관계와 쿼리처리 (0) | 2022.03.29 |