← 블로그 목록

정규표현식(Regex) 완벽 가이드: 패턴부터 실무까지

정규표현식의 기초부터 복잡한 패턴까지. 이메일 검증, 전화번호, 데이터 추출 등 실무 활용 사례를 정규표현식으로 마스터하세요.

정규표현식, 강력하지만 어렵다

정규표현식(Regular Expression, Regex)은 문자열 패턴을 정의하고 검색, 치환, 추출하는 도구입니다. 이메일 검증부터 로그 파일 분석까지 다양한 곳에 사용됩니다.

하지만 많은 개발자가 정규표현식을 "어렵고 복잡한 것"으로 생각합니다. 이 가이드에서는 기초부터 실무 활용까지 체계적으로 배울 수 있습니다.

1부: 정규표현식 기초

정규표현식이란?

정규표현식은 특정 규칙을 가진 문자열의 집합을 표현하는 방법입니다:

패턴: /^[a-z]+@[a-z]+.[a-z]+$/
매칭: john@example.com ✓
미매칭: john@example X

정규표현식 문법 기초

1. 문자 클래스 (Character Classes)

[abc]      → a, b, c 중 하나
[a-z]      → a부터 z까지 소문자
[A-Z]      → A부터 Z까지 대문자
[0-9]      → 0부터 9까지 숫자
[^abc]     → a, b, c가 아닌 문자
.          → 모든 문자 (줄바꿈 제외)

2. 수량자 (Quantifiers)

a*         → a 0개 이상 (aaaa, aa, a, 빈문자)
a+         → a 1개 이상 (aaaa, aa, a)
a?         → a 0개 또는 1개 (a, 빈문자)
a{3}       → a 정확히 3개
a{2,4}     → a 2개 이상 4개 이하
a{2,}      → a 2개 이상

3. 앵커 (Anchors)

^          → 문자열의 시작
$          → 문자열의 끝
         → 단어 경계
B         → 단어 경계가 아닌 곳

간단한 예시

// 숫자만
/^d+$/
매칭: 12345, 0, 999
미매칭: 123a, -5

// 소문자 영문자
/^[a-z]+$/
매칭: hello, abc
미매칭: Hello123, 사과

// 공백 포함 문장
/^[a-zs]+$/
매칭: hello world
미매칭: Hello123

2부: 실무 패턴

1. 이메일 검증

// 기본 패턴
/^[a-z0-9]+@[a-z0-9]+.[a-z]{2,}$/i

// 더 정확한 패턴
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/

매칭:
- user@example.com ✓
- john.doe+tag@company.co.uk ✓

미매칭:
- @example.com ✗ (@ 앞에 문자 필요)
- user@.com ✗ (도메인 명 필요)
- user example.com ✗ (@ 필요)

2. 전화번호 검증 (한국)

// 010-1234-5678 형식
/^01[0-9]-d{3,4}-d{4}$/

매칭:
- 010-1234-5678 ✓
- 02-123-4567 ✓

// 하이픈 없음도 허용
/^01[0-9]d{7,8}$|^0[2-9]d{8,9}$/

매칭:
- 01012345678 ✓
- 01000000000 ✓

3. 패스워드 검증

// 8자 이상, 대문자, 소문자, 숫자 포함
/^(?=.*[a-z])(?=.*[A-Z])(?=.*d).{8,}$/

설명:
(?=.*[a-z])  → 최소 1개 소문자 (선행 확인)
(?=.*[A-Z])  → 최소 1개 대문자
(?=.*d)     → 최소 1개 숫자
.{8,}        → 8자 이상

매칭:
- MyPassword123 ✓
- SecurePass2 ✓

미매칭:
- password123 ✗ (대문자 없음)
- Password ✗ (숫자 없음)

4. URL 검증

// 기본 URL 패턴
/^https?://[^s]+$/

// 더 정확한 패턴
/^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/i

매칭:
- https://example.com ✓
- https://www.example.co.uk ✓
- example.com ✓ (https 생략)

미매칭:
- htp://example.com ✗ (오타)
- example ✗ (도메인 확장자 필요)

5. IP 주소 검증

// IPv4 주소
/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/

매칭:
- 192.168.1.1 ✓
- 255.255.255.255 ✓

미매칭:
- 256.1.1.1 ✗ (256은 범위 초과)
- 192.168.1 ✗ (4개 옥텟 필요)

6. 이미지 파일명

// jpg, png, gif, webp만
/.(jpg|jpeg|png|gif|webp)$/i

매칭:
- photo.jpg ✓
- image.PNG ✓ (대소문자 무시)

미매칭:
- photo.svg ✗
- image.jpg.txt ✗

3부: 프로그래밍에서의 사용

JavaScript 정규표현식

1. 매칭 확인

const regex = /^[a-z]+@[a-z]+.[a-z]+$/i;
console.log(regex.test('john@example.com'));  // true
console.log(regex.test('invalid-email'));     // false

2. 문자열 찾기

const text = 'Hello World, Hello JavaScript';
const matches = text.match(/Hello/g);
console.log(matches);  // ['Hello', 'Hello']

3. 문자열 치환

const text = 'I like cats and dogs';
const replaced = text.replace(/cats/g, 'dogs');
console.log(replaced);  // 'I like dogs and dogs'

4. 데이터 추출

const phone = '010-1234-5678';
const match = phone.match(/(d+)-(d+)-(d+)/);
console.log(match[1]);  // '010'
console.log(match[2]);  // '1234'
console.log(match[3]);  // '5678'

Python 정규표현식

import re

# 매칭 확인
pattern = r'^[a-z]+@[a-z]+.[a-z]+$'
re.match(pattern, 'john@example.com', re.IGNORECASE)  # Match object

# 모든 매칭 찾기
text = 'Hello World, Hello Python'
re.findall(r'Hello', text)  # ['Hello', 'Hello']

# 문자열 치환
re.sub(r'cats', 'dogs', 'I like cats')  # 'I like dogs'

4부: 고급 패턴

1. 그룹 (Groups)

// 날짜 추출 (YYYY-MM-DD)
/(d{4})-(d{2})-(d{2})/

매칭: 2026-03-02
그룹 1: 2026 (연도)
그룹 2: 03 (월)
그룹 3: 02 (일)

2. 선택 (Alternation)

// 고양이 또는 개
/cat|dog/

// 파일 형식
/.(jpg|png|gif|webp)$/i

3. 후행 확인 (Lookahead/Lookbehind)

// 숫자 뒤의 단어 (예: price 뒤의 숫자)
/price (?=d+)/

// 구체적인 예
const text = 'price 100, cost 50';
text.match(/(?<=price )d+/);  // ['100']

4. 비탐욕적 매칭

// 탐욕적 (greedy)
/<.*>/
'
hello
' → '
hello
' (전체 매칭) // 비탐욕적 (non-greedy) /<.*?>/ '
hello
' → '
' (최소 매칭)

5부: 정규표현식 도구

온라인 테스터

정규표현식 테스터를 사용하면:

  • 실시간으로 패턴 테스트
  • 매칭 시각화
  • 그룹 추출 확인
  • 다양한 플래그 적용 (g, i, m 등)

정규표현식 자동 생성

복잡한 패턴이 필요하면:

  • Regex101.com: 상세한 설명과 라이브러리별 지원
  • Regexper.com: 패턴을 시각적으로 표현
  • ChatGPT: 자연어로 설명하고 패턴 생성

자주 하는 실수

1. 특수문자 이스케이프

❌ /a.b/ (모든 문자와 매칭)

✅ /a.b/ (점과 정확히 매칭)

2. 앵커 빠뜨리기

❌ /abc/ ("abc"가 어디든 포함되면 매칭)

✅ /^abc$/ (정확히 "abc"만)

3. 글로벌 플래그 빠뜨리기

❌ /hello/ (첫 번째만 찾음)

✅ /hello/g (모든 것 찾음)

4. 성능 문제

❌ /(a|a)*b/ (과도한 백트래킹)

✅ /a*b/ (단순화)

마무리

정규표현식은 처음에는 어렵지만, 자주 사용하면 강력한 도구가 됩니다. 작은 패턴부터 시작해서 점차 복잡한 패턴으로 나아가세요.

정규표현식 테스터로 실시간으로 패턴을 테스트하고, 각 요소가 어떻게 작동하는지 이해해보세요!