회원가입 폼에서 이메일 형식이 맞는지 검증하라는 요구사항을 받았다. if문으로 @가 있는지, 점이 있는지 하나씩 체크할 수도 있지만, 정규표현식 한 줄이면 훨씬 깔끔하게 처리된다. 문제는 정규식 문법이 처음 보면 암호 같다는 것이다.
정규표현식(Regex)이란
문자열에서 특정 패턴을 찾거나, 치환하거나, 유효성을 검증하기 위한 표현 언어다. 거의 모든 프로그래밍 언어에서 지원한다.
/^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,}$/
이게 이메일 검증 정규식의 기본 형태다. 처음에는 읽기 어렵지만, 구성 요소를 하나씩 뜯어보면 규칙이 있다.
기본 문법 정리
| 기호 | 의미 | 예시 |
|---|---|---|
. | 아무 문자 1개 | a.c → abc, a1c, a-c |
* | 앞 문자 0회 이상 반복 | ab*c → ac, abc, abbc |
+ | 앞 문자 1회 이상 반복 | ab+c → abc, abbc (ac는 안 됨) |
? | 앞 문자 0회 또는 1회 | colou?r → color, colour |
^ | 문자열 시작 | ^Hello → Hello로 시작하는 문자열 |
$ | 문자열 끝 | end$ → end로 끝나는 문자열 |
[abc] | a, b, c 중 하나 | [aeiou] → 모음 1개 |
[0-9] | 숫자 0~9 | [0-9]+ → 연속된 숫자 |
\d | 숫자 (=[0-9]) | \d{3} → 숫자 3자리 |
\w | 영문+숫자+밑줄 | \w+ → 단어 |
실무에서 바로 쓰는 패턴 모음
이메일 검증
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
@앞에 영문+숫자+특수문자, @뒤에 도메인, 마지막에 최소 2자리 이상의 TLD를 요구한다.
한국 전화번호
/^01[016789]-?\d{3,4}-?\d{4}$/
010, 011, 016, 017, 018, 019로 시작하고 하이픈은 있어도 되고 없어도 된다.
한글만
/^[가-힣]+$/
한글 완성형 글자만 허용한다. ㄱ, ㅎ 같은 자음/모음은 포함되지 않는다.
URL
/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z]{2,}([-a-zA-Z0-9@:%_+.~#?&/=]*)/
주의 이메일이나 URL의 정규식은 완벽하지 않다. RFC 표준에 따르면 허용되는 형식이 훨씬 복잡하기 때문에, 위 패턴은 일반적인 경우에만 유효하다. 100% 정확한 검증이 필요하면 라이브러리를 쓰는 게 안전하다.
정규식 작성 시 실수를 줄이는 법
정규식은 한 글자만 틀려도 전혀 다른 결과가 나온다. 코드에 넣기 전에 테스트 문자열로 확인하는 게 필수다. 정규식 테스터에 패턴을 넣고 테스트 문자열을 입력하면 매칭 결과가 실시간으로 하이라이트된다. 캡처 그룹의 내용과 위치(인덱스)도 표시되니까 복잡한 패턴을 디버깅할 때 편하다. 이메일, URL, 전화번호, 한글 프리셋도 버튼 하나로 불러올 수 있다.
정규표현식은 처음에만 어렵다. 기본 문법 10개만 외우면 실무에서 쓰이는 패턴의 대부분을 이해할 수 있고, 직접 만들 수도 있게 된다.