입력값 검증 로직에 정규식을 넣었는데, 테스트 케이스 절반이 실패한다. 패턴이 틀린 건지 플래그가 빠진 건지 코드만 보고는 파악이 안 된다. 정규식은 작성보다 검증이 더 까다롭다.
자주 쓰는 정규식 패턴
매번 처음부터 작성하면 실수가 생기기 쉽다. 실무에서 반복적으로 쓰이는 패턴을 정리했다.
| 용도 | 패턴 | 매칭 예시 |
|---|---|---|
| 이메일 | [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?://[\w\-]+(\.[\w\-]+)+[/\w\-.?=%]* | https://example.com/path |
| 한글만 | [가-힣]+ | 서울특별시 |
| 숫자만 | ^\d+$ | 12345 |
이 패턴들을 프리셋으로 제공하는 도구가 있으면 클릭 한 번으로 불러와서 바로 테스트할 수 있다.
플래그가 결과를 바꾼다
같은 패턴이라도 플래그 설정에 따라 결과가 완전히 달라진다.
g(global)- 첫 번째 매칭에서 멈추지 않고 모든 매칭을 찾는다. 이걸 빼면 첫 번째 결과만 나온다.
i(case-insensitive)- 대소문자를 구분하지 않는다.
/hello/i는 "Hello", "HELLO" 모두 매칭된다. m(multiline)^와$가 문자열 전체가 아닌 각 줄의 시작과 끝에 적용된다.s(dotAll).이 줄바꿈 문자까지 포함해서 매칭한다. 여러 줄에 걸친 패턴을 찾을 때 필요하다.
패턴 작성하고 바로 확인하기
온라인 정규식 테스터에 패턴을 입력하면 테스트 문자열에서 매칭되는 부분이 즉시 하이라이트된다. 몇 번째 문자에서 매칭이 시작되는지, 캡처 그룹은 어떤 값을 잡았는지까지 상세하게 나온다.
- 상단 패턴 입력창에 정규식을 작성한다
- 필요한 플래그(g, i, m, s)를 켜거나 끈다
- 아래쪽에 테스트할 문자열을 붙여넣는다
- 매칭 결과가 실시간으로 하이라이트되고, 매칭 횟수와 위치가 표시된다
프리셋 패턴(이메일, URL, 전화번호, 한글)도 내장되어 있어서 기본 패턴을 불러온 뒤 요구사항에 맞게 수정하는 식으로 쓸 수 있다.
정규식 디버깅 팁
- 단순한 것부터 시작: 복잡한 패턴을 한 번에 쓰지 말고, 핵심 부분만 먼저 테스트한 뒤 조건을 하나씩 추가하라
- 그리디 vs 레이지:
.*는 최대한 많이 잡고(그리디),.*?는 최소한으로 잡는다(레이지). HTML 태그 매칭에서 차이가 크다 - 이스케이프 확인:
.,(,[같은 특수문자를 리터럴로 매칭하려면\로 이스케이프해야 한다 - 경계 조건 테스트: 빈 문자열, 공백만 있는 입력, 특수문자가 포함된 입력으로도 테스트해보라
자주 묻는 질문
JavaScript와 Python의 정규식이 다른가요?
기본 문법은 같지만 세부 기능에 차이가 있다. Python은 lookbehind에서 가변 길이를 지원하고, JavaScript는 ES2018부터 named capture group을 지원하기 시작했다. 이 테스터는 JavaScript 엔진 기반이므로 Python에서만 지원하는 기능은 결과가 다를 수 있다.
정규식으로 이메일을 100% 검증할 수 있나요?
RFC 5322 규격을 완벽히 따르는 정규식은 수백 자가 넘는다. 실무에서는 기본 형식만 검사하고 실제 검증은 인증 메일 발송으로 처리하는 게 일반적이다.
캡처 그룹은 어디에 쓰나요?
매칭된 문자열의 특정 부분만 추출할 때 쓴다. 예를 들어 날짜 패턴 (\d{4})-(\d{2})-(\d{2})에서 그룹 1은 연도, 그룹 2는 월, 그룹 3은 일을 각각 잡아준다.
정규식은 한 번 익히면 언어를 바꿔도 계속 쓰게 된다. 패턴을 쓸 때마다 코드를 실행해서 검증하기보다, 테스터에서 실시간으로 확인하면서 다듬는 편이 훨씬 빠르다.