정규표현식, 강력하지만 어렵다
정규표현식(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
미매칭: Hello1232부: 실무 패턴
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')); // false2. 문자열 찾기
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)$/i3. 후행 확인 (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/ (단순화)
마무리
정규표현식은 처음에는 어렵지만, 자주 사용하면 강력한 도구가 됩니다. 작은 패턴부터 시작해서 점차 복잡한 패턴으로 나아가세요.
정규표현식 테스터로 실시간으로 패턴을 테스트하고, 각 요소가 어떻게 작동하는지 이해해보세요!