코드 리뷰에서 /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ 같은 줄을 만나면 머리가 멍해진다. 정규표현식(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 |
[abc] | a, b, c 중 하나 | [aeiou] → 모음 매칭 |
^ | 문자열 시작 | ^Hello → Hello로 시작하는 줄 |
$ | 문자열 끝 | \.com$ → .com으로 끝나는 문자열 |
실무에서 바로 쓰는 패턴 모음
이메일 주소 검증
/^[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로 시작하고, 하이픈은 있어도 되고 없어도 매칭된다.
한글만 허용
/^[가-힣]+$/
완성형 한글만 통과한다. 자음이나 모음만 단독으로 들어오면 불일치.
플래그의 역할
g(global): 첫 번째 매칭에서 멈추지 않고 전체에서 찾는다i(case-insensitive): 대소문자를 구분하지 않는다m(multiline): ^와 $가 전체 문자열이 아닌 각 줄의 시작/끝에 적용된다s(dotAll): .이 줄바꿈 문자까지 포함해서 매칭한다
패턴 작성하고 바로 확인하기
정규식은 머릿속으로만 짜면 거의 틀린다. 패턴을 쓰고 테스트 문자열을 넣어서 매칭 결과를 눈으로 확인하는 게 가장 확실하다. 정규식 테스터에 패턴과 텍스트를 입력하면 매칭되는 부분이 실시간으로 하이라이트 표시되고, 캡처 그룹 정보와 매칭 위치까지 상세하게 나온다. 이메일, URL, 전화번호 같은 자주 쓰는 패턴은 프리셋으로 제공되니까, 처음부터 짤 필요 없이 프리셋을 기반으로 수정하면 시간이 줄어든다.
정규식은 외우는 게 아니라 만들고 테스트하면서 익히는 거다. 복잡한 패턴일수록 한 단계씩 쌓아 올려야 실수가 줄어든다.