회원가입 폼에 이메일 유효성 검사를 넣었는데 정상적인 주소가 자꾸 걸러진다. 정규식을 눈으로 읽으면 맞는 것 같은데 실제 매칭 결과가 다르다. 정규표현식은 한 글자만 틀려도 의도와 전혀 다른 결과가 나오기 때문에 패턴을 직접 돌려보지 않으면 디버깅이 어렵다.
정규식이 안 먹히는 흔한 원인
- 이스케이프 누락 — 마침표(.)는 정규식에서 "아무 문자"를 뜻한다. 실제 점을 매칭하려면
\.으로 이스케이프해야 한다. - 앵커 빠뜨림 —
^\d+$처럼 시작(^)과 끝($)을 안 넣으면 문자열 일부만 매칭돼서 통과시키면 안 될 입력이 통과된다. - 플래그 설정 실수 — 대소문자를 구분하지 않으려면
i플래그가 필요하고, 여러 줄을 매칭하려면m플래그를 켜야 한다. - 탐욕적 매칭 —
.*은 가능한 한 많이 잡는다. 최소 매칭이 필요하면.*?로 바꿔야 한다.
실무에서 바로 쓰는 정규식 패턴
| 용도 | 패턴 | 매칭 예시 |
|---|---|---|
| 이메일 | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} | [email protected] |
| 한국 전화번호 | 01[016789]-?\d{3,4}-?\d{4} | 010-1234-5678 |
| 한글만 | [가-힣]+ | 안녕하세요 |
| URL | https?:\/\/[^\s]+ | https://example.com |
패턴을 바로 테스트하려면
정규식은 머릿속으로 돌리면 거의 틀린다. 정규식 테스터에 패턴과 테스트 문자열을 넣으면 매칭되는 부분이 실시간으로 하이라이트된다. 캡처 그룹별로 어떤 값이 잡히는지도 상세하게 나오고, g/i/m/s 플래그를 토글로 켜고 끌 수 있어서 플래그에 따른 결과 차이를 바로 비교할 수 있다. 이메일, 전화번호, URL 같은 프리셋 패턴도 내장돼 있어서 처음부터 작성할 필요 없이 가져다 쓸 수 있다.
주의 정규식은 언어마다 미세하게 다르다. JavaScript의 정규식이 Python이나 Java에서는 다르게 동작할 수 있다. 테스터의 엔진이 자기가 쓰는 언어와 같은지 확인하고 테스트하는 게 안전하다.
정규식 하나 잘못 쓰면 유효한 이메일을 막거나, 잘못된 입력을 통과시킨다. 배포 전에 한 번 돌려보는 습관이면 충분하다.