회원가입 폼에서 이메일 형식을 검증해야 한다. if (email.includes('@'))만으로는 부족하다. "@@.com"이나 "test@"도 통과해버리기 때문이다. 이럴 때 쓰는 게 정규표현식(Regular Expression, regex)이다.
정규식 기본 문법
| 기호 | 의미 | 예시 | 매치되는 것 |
|---|---|---|---|
. | 아무 문자 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 |
\d | 숫자 (0~9) | \d{3} | 123, 456 |
\w | 영문자/숫자/_ | \w+ | hello, test_1 |
^ | 문자열 시작 | ^Hello | Hello로 시작하는 줄 |
$ | 문자열 끝 | end$ | end로 끝나는 줄 |
[abc] | a, b, c 중 하나 | [aeiou] | 모음 한 글자 |
() | 그룹 캡처 | (\d{2})-(\d{4}) | 02-1234에서 02와 1234 캡처 |
실무에서 자주 쓰는 패턴
이메일 검증
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
"@" 앞에 영문/숫자/특수문자, "@" 뒤에 도메인, 마지막에 .com, .kr 같은 최상위 도메인을 확인한다.
한국 전화번호
^01[016789]-?\d{3,4}-?\d{4}$
010, 011, 016 등으로 시작하고, 하이픈은 있어도 되고 없어도 되는 패턴이다.
한글만 허용
^[가-힣]+$
이름 입력란처럼 한글만 받아야 할 때 쓴다.
플래그 4가지
g(global)- 첫 번째 매치에서 멈추지 않고 전체를 검색한다. 찾기/바꾸기에 필수.
i(ignore case)- 대소문자를 구분하지 않는다.
/hello/i는 Hello, HELLO, hElLo 모두 매치. m(multiline)^와$가 전체 문자열이 아닌 각 줄의 시작/끝에 매치된다.s(dotAll).이 줄바꿈 문자까지 포함한다. 여러 줄에 걸친 패턴을 찾을 때 필요하다.
테스트는 코드 밖에서 먼저
정규식은 한 글자 차이로 결과가 완전히 달라진다. 코드에 바로 넣고 실행하면 디버깅이 어렵다. 정규식 테스터에 패턴과 테스트 문자열을 넣으면 매치된 부분이 즉시 하이라이트되고, 캡처 그룹과 매치 위치까지 상세하게 나온다. 이메일, URL, 전화번호, 한글 같은 프리셋 패턴도 제공돼서 처음부터 짤 필요 없이 가져다 쓸 수 있다.
TIP 정규식을 너무 복잡하게 만들면 유지보수가 힘들어진다. 완벽한 이메일 정규식은 수백 자가 넘는데, 실무에서는 기본 형식만 검증하고 실제 발송으로 확인하는 편이 낫다.
정규식은 한 번 익혀두면 어떤 언어에서든 거의 같은 문법으로 쓸 수 있다. 패턴을 짤 때마다 테스터에서 먼저 확인하는 습관이 삽질을 크게 줄여준다.