topic★★★★★난이도 · 약 15분
실전 regex 레시피 — 이메일·URL·전화·공백
자주 쓰는 10가지 패턴 + Claude에게 regex 정확히 요청하는 법.
#regex#이메일#URL#공백#ReDoS
왜 배우는가
"이메일 형식 검증", "URL 추출", "공백 정리"는 바이브코더 매일 요청 TOP 10. 미리 써둔 레시피가 있으면 복붙 + 미세 조정으로 끝난다.
| 목적 | 패턴 | 주의 |
|---|---|---|
| 이메일(대충) | `/^[\w.+-]+@[\w-]+\.[a-z]{2,}$/i` | 완벽 아님(RFC 5322 복잡), HTML `type=email` 권장 |
| URL 추출 | `/https?:\/\/[\w\-\.\/?=&%:]+/g` | 한글 URL·포트 누락 가능 |
| 한국 휴대폰 | `/^01[0-9]-?\d{3,4}-?\d{4}$/` | 하이픈 선택 |
| IPv4 | `/^(\d{1,3}\.){3}\d{1,3}$/` | 0~255 검증 별도 필요 |
| UUID v4 | `/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i` | v4 버전 비트 체크 |
| 연속 공백 → 1개 | 치환 `/\s+/g` → `' '` | 탭·개행 포함 |
| HTML 태그 제거 | 치환 `/<[^>]+>/g` → `''` | 복잡 HTML엔 DOMParser |
| 주석 제거 (// JS) | `/\/\/.*$/gm` | 문자열 속 `//`는 잘못 지움 |
| 한글만 | `/[가-힣]+/g` | 자음/모음 단독 제외 |
| 통화 포맷 | 치환 `/\B(?=(\d{3})+(?!\d))/g` → `','` | 천 단위 콤마 |
javascript
// 실전 한 줄 레시피
// 1) 양 끝 공백 + 중간 연속 공백 정리
s.trim().replace(/\s+/g, " ");
// 2) URL 전부 찾기
text.match(/https?:\/\/[^\s<>"']+/g);
// 3) 숫자 천 단위 콤마
n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); // 1234567 → "1,234,567"
// 4) 이메일 마스킹 (kim@ex.com → k**@ex.com)
email.replace(/^(.)(.*?)(@.*)$/, (_, a, b, c) => a + "*".repeat(b.length) + c);
// 5) CSV 한 줄 파싱 (큰따옴표 내부 콤마 존중) — regex로는 난해, Papa Parse 권장
// 6) 날짜 추출 (YYYY-MM-DD)
text.match(/\b\d{4}-\d{2}-\d{2}\b/g);
// 7) 명명 캡처 그룹 (ES2018+)
const m = "2024-03-15".match(/^(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})$/);
m.groups.y; // "2024"명명 캡처(`(?<name>...)`)는 여러 그룹일 때 index 대신 이름으로 접근 → 가독성 상승.
Claude에게 regex 요청할 때. ① 목표 예시 3~5개(매칭될 것 + 매칭되지 말아야 할 것). ② 언어·플래그 명시. ③ 필요하면 "과도 매칭 금지" 등 제약 명시. 예: "Python regex로, 한국 휴대폰만 매칭하고 02-1234-5678 같은 지역번호는 제외."
ReDoS(정규식 DoS) 주의. `(a+)+$` 같은 패턴에 긴 입력을 넣으면 지수적 시간이 걸려 서버가 멈춘다. 악의적 사용자 입력을 regex로 검증할 때 특히 조심. Safe regex 라이브러리(`re2`, `redos-checker`) 활용.
실기 드릴 2문항
edit실기 드릴 · 단답형
연속된 공백 여러 개를 한 칸으로 줄이는 JS 표현식은?
check_circle실기 드릴 · OX
복잡한 HTML을 파싱할 땐 정규식이 표준이다.