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을 파싱할 땐 정규식이 표준이다.