유틸리티

정규식이 안 먹힐 때, 패턴을 바로 확인하는 방법

회원가입 폼에 이메일 유효성 검사를 넣었는데 정상적인 주소가 자꾸 걸러진다. 정규식을 눈으로 읽으면 맞는 것 같은데 실제 매칭 결과가 다르다. 정규표현식은 한 글자만 틀려도 의도와 전혀 다른 결과가 나오기 때문에 패턴을 직접 돌려보지 않으면 디버깅이 어렵다.

정규식이 안 먹히는 흔한 원인

  • 이스케이프 누락 — 마침표(.)는 정규식에서 "아무 문자"를 뜻한다. 실제 점을 매칭하려면 \.으로 이스케이프해야 한다.
  • 앵커 빠뜨림^\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
한글만[가-힣]+안녕하세요
URLhttps?:\/\/[^\s]+https://example.com

패턴을 바로 테스트하려면

정규식은 머릿속으로 돌리면 거의 틀린다. 정규식 테스터에 패턴과 테스트 문자열을 넣으면 매칭되는 부분이 실시간으로 하이라이트된다. 캡처 그룹별로 어떤 값이 잡히는지도 상세하게 나오고, g/i/m/s 플래그를 토글로 켜고 끌 수 있어서 플래그에 따른 결과 차이를 바로 비교할 수 있다. 이메일, 전화번호, URL 같은 프리셋 패턴도 내장돼 있어서 처음부터 작성할 필요 없이 가져다 쓸 수 있다.

주의 정규식은 언어마다 미세하게 다르다. JavaScript의 정규식이 Python이나 Java에서는 다르게 동작할 수 있다. 테스터의 엔진이 자기가 쓰는 언어와 같은지 확인하고 테스트하는 게 안전하다.

정규식 하나 잘못 쓰면 유효한 이메일을 막거나, 잘못된 입력을 통과시킨다. 배포 전에 한 번 돌려보는 습관이면 충분하다.