Skip to content

정규표현식

💡 학습 가이드: 정규표현식이 외계어처럼 보이시나요? 사실 이는 "텍스트 패턴을 기술하는" 미니 언어일 뿐입니다. 이 장에서는 정규표현식의 핵심 개념을 처음부터 이해하고, 몇 가지 핵심 기호만으로 80%의 텍스트 검색 및 검증 문제를 해결하는 방법을 배웁니다.


0. 왜 정규표현식이 필요한가?

다음과 같은 상황을 상상해 보세요:

  • 방대한 로그에서 모든 IP 주소 찾기
  • 사용자가 입력한 이메일 형식이 유효한지 검증하기
  • 텍스트의 모든 날짜 형식을 2024/01/15에서 2024-01-15로 변경하기
  • 웹페이지 소스에서 모든 링크 추출하기

일반 문자열 검색으로? 수많은 if-else 판단 로직을 작성해야 합니다. 정규표현식으로? 패턴 한 줄로 해결됩니다.


1. 정규표현식 입문: 3분 만에 시작하기

👇 클릭해서 사용해 보세요: 정규표현식을 입력하고 실시간으로 매칭 결과를 확인하세요

Regular Expressions: Search Engine for TextPattern matching · capture groups · live preview
//
Match results3 match(es)
My phone is 13812345678, landline is 010-12345678, and email is test@example.com
#1"13812345678"
#2"010"
#3"12345678"
Try presets:
Core idea:A regular expression is a small language for describing text patterns with special symbols. It appears everywhere in search, replacement, and validation.

💡 한 줄 이해

정규표현식 = 특수 기호로 "어떤 텍스트를 찾고 싶은지" 기술하는 것. \d는 숫자, +는 하나 이상을 의미하므로 \d+는 "하나 이상의 숫자"입니다.


2. 핵심 개념: 블록 쌓듯 조합하기

정규표현식의 본질은 세 가지 블록으로 원하는 패턴을 만드는 것입니다:

2.1 블록 1: 문자 클래스 (어떤 문자와 매칭할지)

문법의미예시
.임의의 문자a.c → abc, a1c, a c
\d숫자 [0-9]\d\d → 42, 99
\w문자/숫자/언더스코어\w+ → hello, user_1
\s공백 문자공백, 탭 매칭
[abc]집합 내 임의의 문자[aeiou] → 모음
[^abc]집합에 없는 문자[^0-9] → 숫자가 아닌 문자

2.2 블록 2: 수량자 (몇 번 매칭할지)

문법의미예시
*0회 이상ab* → a, ab, abbb
+1회 이상ab+ → ab, abbb (a는 매칭 안 됨)
?0회 또는 1회colou?r → color, colour
{3}정확히 3회\d{3} → 123
{2,4}2~4회\d{2,4} → 12, 1234

2.3 블록 3: 위치와 그룹화

문법의미예시
^행 시작^Hello → Hello로 시작하는 행
$행 끝end$ → end로 끝나는 행
\b단어 경계\bcat\b → cat (catch는 매칭 안 됨)
(...)캡처 그룹(\d+)-(\d+) → 각각 캡처
a|b또는cat|dog → cat 또는 dog

3. 실전: 자주 사용하는 검증 패턴

3.1 이메일 검증

[\w.+-]+@[\w-]+\.[\w.]+

분해:

  • [\w.+-]+ — 사용자명 부분 (문자, 숫자, 점, 더하기, 하이픈)
  • @ — 리터럴 @
  • [\w-]+ — 도메인 부분
  • \. — 이스케이프된 점
  • [\w.]+ — 최상위 도메인

3.2 휴대폰 번호 검증 (중국)

1[3-9]\d{9}

분해:

  • 1 — 1로 시작
  • [3-9] — 두 번째 자리는 3-9
  • \d{9} — 이후 9자리 숫자

3.3 비밀번호 강도 검사

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$

분해:

  • (?=.*[a-z]) — 최소 하나의 소문자 (전방 탐색)
  • (?=.*[A-Z]) — 최소 하나의 대문자
  • (?=.*\d) — 최소 하나의 숫자
  • .{8,} — 총 길이 최소 8자

4. 코드에서 정규표현식 사용하기

JavaScript

javascript
const text = '연락처: 13812345678 또는 15099887766'
const regex = /1[3-9]\d{9}/g
const phones = text.match(regex)
// ['13812345678', '15099887766']

// 치환
text.replace(/\d{4}(?=\d{4}$)/, '****')
// 휴대폰 번호 중간 4자리 숨기기

// 검증
/^[\w.+-]+@[\w-]+\.[\w.]+$/.test('user@example.com')
// true

Python

python
import re

text = '가격은 99 위안, 할인 20 위안'
numbers = re.findall(r'\d+', text)
# ['99', '20']

# 치환
re.sub(r'\d+', 'X', text)
# '가격은 X 위안, 할인 X 위안'

# 그룹 캡처
match = re.search(r'(\d+)-(\d+)', '2024-01-15')
match.group(1)  # '2024'
match.group(2)  # '01'

5. 탐욕적 vs 게으른: 중요한 차이

텍스트: <b>hello</b> and <b>world</b>
패턴매칭 결과설명
<b>.*</b><b>hello</b> and <b>world</b>탐욕적: 최대한 많이 매칭
<b>.*?</b><b>hello</b>게으른: 최소한만 매칭

💡 기억하세요

기본값은 탐욕적 모드입니다. 수량자 뒤에 ?를 붙이면 게으른 모드가 됩니다. 대부분의 경우 게으른 모드가 필요합니다.


6. 요약

📚 핵심 포인트

  1. 정규표현식 = 텍스트 패턴을 기술하는 미니 언어, 검색, 매칭, 치환에 사용
  2. 세 가지 블록: 문자 클래스(무엇을 매칭) + 수량자(몇 번 매칭) + 위치/그룹화
  3. \d \w \s는 가장 자주 사용하는 세 가지 문자 클래스, 숫자, 단어, 공백을 커버
  4. 처음부터 작성할 필요 없음: 일반적인 상황에는 검증된 정규표현식 패턴을 재사용 가능
  5. 탐욕적 vs 게으른: 기본값은 탐욕적(많이 매칭), ? 추가 시 게으른(적게 매칭)

다음 학습: