회원가입 폼에서 이메일 형식을 검증해야 하는데, 정규식을 짰더니 user@com도 통과시키고 [email protected]도 잡아내지 못한다. 정규표현식은 한 글자만 잘못 써도 결과가 완전히 달라지기 때문에, 코드에 넣기 전에 미리 테스트하는 과정이 필수다.
정규표현식 기초 문법
정규식을 처음 보면 암호 같지만, 기본 기호 몇 가지만 알면 읽히기 시작한다.
| 기호 | 의미 | 예시 |
|---|---|---|
. | 아무 문자 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} → 010, 123 |
\w | 영문, 숫자, 밑줄 | \w+ → hello, user_1 |
[abc] | a, b, c 중 하나 | [가-힣] → 한글 1자 |
^ / $ | 시작 / 끝 | ^Hello$ → 정확히 "Hello"만 |
실무에서 자주 쓰는 패턴
이메일 검증
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$@ 앞에 영문·숫자·일부 특수문자, @ 뒤에 도메인, 마지막에 2자리 이상 확장자. 완벽하지는 않지만 대부분의 일반적인 이메일 주소를 걸러낸다.
한국 전화번호
^01[016789]-?\d{3,4}-?\d{4}$010, 011, 016, 017, 018, 019로 시작하고, 하이픈은 있어도 없어도 매칭된다.
한글만 허용
^[가-힣]+$자음이나 모음만 단독으로 입력한 것(ㄱ, ㅏ)은 제외하고, 완성된 한글 글자만 통과시킨다.
플래그 설정에 따라 결과가 달라진다
- g (global): 첫 매칭에서 멈추지 않고 문자열 전체에서 모든 매칭을 찾는다
- i (case-insensitive): 대소문자를 구분하지 않는다.
/hello/i는 Hello, HELLO도 매칭 - m (multiline):
^와$가 각 줄의 시작/끝에 적용된다 - s (dotAll):
.이 줄바꿈 문자까지 매칭한다
TIP 정규식을 짜면서 실시간으로 결과를 확인하고 싶다면 정규식 테스터를 쓰면 된다. 패턴을 입력하면 테스트 문자열에서 매칭 부분이 즉시 하이라이트되고, 캡처 그룹과 매치 위치까지 보여준다. 이메일, URL, 전화번호 같은 프리셋 패턴도 제공하니 처음부터 짜지 않아도 된다.
정규식은 외우는 게 아니라 테스트하면서 다듬는 것이다. 한 번에 완벽한 패턴을 짜려 하지 말고, 테스트 도구에서 케이스를 하나씩 넣어보며 수정하는 게 가장 빠른 방법이다.