개발자 도구#정규식#Regex#JavaScript

정규식이 어렵게 느껴지는 이유 — 실무 8개 패턴으로 끝내기

이메일·전화번호·날짜·URL 등 실제로 자주 쓰는 정규식 패턴 8개와, 정규식이 헷갈리는 핵심 4가지 개념.

2026-04-15·11분 읽기·HengSsg

정규식 (Regular Expression) 은 ‘검색·추출·치환을 수학 같은 표현식으로 처리하는 도구’ 다. 문법이 짧지만 의미 밀도가 높아 처음에는 거의 외계어처럼 보인다. 이 글은 실무에서 쓰는 패턴 8개와 정규식을 헷갈리게 만드는 4가지 핵심 개념을 정리한다. 읽고 나면 90% 의 정규식 작업은 두렵지 않다.

핵심 개념 1 — 메타문자 vs 리터럴

대부분 문자는 ‘있는 그대로’ 매칭된다 (리터럴). 하지만 일부 문자는 특수한 의미를 가진다 (메타문자):

. ^ $ * + ? { } ( ) [ ] \ | /

이 문자를 ‘있는 그대로’ 매칭하려면 앞에 백슬래시를 붙여 escape 한다.

/3.14/    →  3 + 임의문자 + 14 매칭 (점이 메타문자)
/3\.14/   →  '3.14' 정확히 매칭

핵심 개념 2 — 수량자 (Quantifier)

  • * — 0회 이상
  • + — 1회 이상
  • ? — 0회 또는 1회
  • {n} — 정확히 n회
  • {n,} — n회 이상
  • {n,m} — n회 이상 m회 이하

핵심 개념 3 — 문자 클래스

  • [abc] — a, b, c 중 하나
  • [a-z] — 소문자 알파벳
  • [^abc] — a, b, c 가 아닌 것
  • \d — 숫자 [0-9]
  • \w — 단어 문자 [a-zA-Z0-9_]
  • \s — 공백 (스페이스, 탭, 줄바꿈)
  • . — 임의 문자 (줄바꿈 제외)

핵심 개념 4 — 앵커

  • ^ — 문자열 시작
  • $ — 문자열 끝
  • \b — 단어 경계

이 4가지만 알면 정규식의 80% 가 보인다. 이제 실전 패턴.

실무 패턴 8개

1. 이메일 검증 (실용형)

/^[\w.+-]+@[\w.-]+\.[a-zA-Z]{2,}$/

‘완벽한 이메일 정규식’ 은 RFC 5322 기준 1000자가 넘는다. 실무에서는 위 패턴이 99% 의 케이스를 잡는다.

2. 한국 휴대폰 번호

/^01[0-9]-?\d{3,4}-?\d{4}$/

‘010-1234-5678’, ‘01012345678’ 모두 매칭. 최신 번호 (010, 011, 016, 017, 018, 019) 포함.

3. 한국 사업자등록번호

/^\d{3}-?\d{2}-?\d{5}$/

형식만 검증. 실제 유효성은 가중치 [1,3,7,1,3,7,1,3,5] 검증식 별도 필요.

4. 날짜 (YYYY-MM-DD)

/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/

‘2026-13-45’ 같은 잘못된 월/일은 걸러지지만, ‘2026-02-30’ (윤년/말일) 까지는 정규식만으로는 한계.

5. URL (http/https)

/^https?:\/\/(?:[\w-]+\.)+[\w]{2,}(?:\/\S*)?$/

6. 한국 주민등록번호 (형식)

/^\d{6}-[1-4]\d{6}$/

실제 검증은 별도 알고리즘 필요. 보안상 절대 클라이언트에 평문 저장 X.

7. IP 주소 (IPv4)

/^(\d{1,3}\.){3}\d{1,3}$/

8. 비밀번호 강도 (8자+, 영문+숫자+특수문자)

/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*])[\w!@#$%^&*]{8,}$/

Lookahead ((?=...)) 로 ‘영문 1개 이상 + 숫자 1개 이상 + 특수문자 1개 이상’ 동시 검증.

플래그 (Flag)

  • i — 대소문자 무시
  • g — 전체 매칭 (첫 번째만이 아니라 모두)
  • m — 다중 줄 (^, $ 가 각 줄에서 동작)
  • s — dotall (. 이 줄바꿈도 매칭)

JavaScript 사용 예시

// 매칭 여부
/^01[0-9]-?\d{4}-?\d{4}$/.test('010-1234-5678')  // true

// 매칭 추출
'전화: 010-1234-5678'.match(/01[0-9]-?\d{4}-?\d{4}/)
// → ['010-1234-5678']

// 치환
'안녕  세상'.replace(/\s+/g, ' ')  // '안녕 세상'

// 캡처 그룹
const m = '2026-04-15'.match(/^(\d{4})-(\d{2})-(\d{2})$/);
// m[1]=2026, m[2]=04, m[3]=15

주의 — 정규식의 한계

  • HTML/XML 파싱은 정규식으로 하지 마라. 파서 라이브러리 사용.
  • 중첩 구조 (괄호 안의 괄호 등) 는 정규식이 못 잡는다.
  • 탐욕적 (greedy) vs 게으른 (lazy) 매칭 — .*.*? 는 다르게 동작.
  • 치명적 백트래킹 — (a+)+b 같은 패턴은 입력에 따라 무한 시간 걸릴 수 있음 (ReDoS 공격).

연습 도구

정규식은 ‘읽기보다 직접 써보는’ 게 훨씬 빠르다. 텍스트와 패턴을 입력하면 매칭 부분이 색칠되는 정규식 테스터로 실시간 확인하면서 익히는 게 가장 효과적이다.

정규식 테스터 (준비중)

정규식은 도구다. 모든 검증 문제를 정규식으로 풀 필요는 없다. 가독성이 중요하면 코드로 풀고, 간결한 패턴 매칭이 핵심이면 정규식을 써라.