Developer Tools

초보자를 위한 정규 표현식: 이해하기 쉬운 패턴들

정규식 문법에 대한 친절한 입문 가이드로, 유효성 검사와 검색에 자주 쓰이는 패턴들과 스트레스 없이 표현식을 테스트하는 방법을 소개합니다.

7분 읽기

노트북 화면의 코드

정규 표현식(regex)은 읽기 어렵다는 인식이 있습니다. 하지만 기본 구성 요소를 익히고 나면, 사용자 입력 유효성 검사부터 로그 파일 검색까지 개발자 도구 중 가장 강력한 것 중 하나가 됩니다.

정규 표현식이란?

정규 표현식은 문자열의 집합을 설명하는 패턴입니다. 정규식 엔진에 패턴과 대상 문자열을 전달하면, 패턴이 일치하는지(그리고 어디서 일치하는지)를 알려줍니다.

const pattern = /hello/i;
pattern.test("Hello World"); // true

/i 플래그는 대소문자를 구분하지 않고 매칭합니다. JavaScript에서 플래그는 닫는 / 뒤에 붙입니다.

핵심 구성 요소

기호 의미 예시 매칭 대상
. 임의의 문자 (줄바꿈 제외) h.t hat, hit, hot
* 이전 요소의 0회 이상 반복 ab*c ac, abc, abbc
+ 이전 요소의 1회 이상 반복 ab+c abc, abbc (ac는 제외)
? 이전 요소의 0회 또는 1회 colou?r color, colour
\d 임의의 숫자 (0–9) \d{3} 123, 007
\w 단어 문자 (문자, 숫자, _) \w+ hello, user_1
\s 공백 문자 (스페이스, 탭, 줄바꿈) \s+ 공백 매칭
^ 문자열의 시작 ^Hello Hello…
$ 문자열의 끝 world$ …world

문자 클래스

대괄호는 매칭할 문자들의 집합을 정의합니다:

[aeiou]     — 모음 중 하나
[A-Z]       — 대문자 중 하나
[0-9a-f]    — 16진수 문자 중 하나
[^0-9]      — 숫자가 아닌 모든 문자

그룹과 교체

괄호는 패턴의 일부를 그룹화하고, |는 "또는"을 의미합니다:

(cat|dog)s?   — cat, cats, dog, dogs 매칭
(\d{3})-(\d{4}) — 555-1234 매칭 및 각 부분 캡처

캡처 그룹은 추출 작업에 유용합니다 — 지저분한 텍스트에서 전화번호, 날짜, ID 등을 꺼낼 때 활용할 수 있습니다.

실무에서 자주 쓰는 패턴

이메일 (간략 버전)

^[^\s@]+@[^\s@]+\.[^\s@]+$

"무언가 @ 무언가 . 무언가" 형식을 검사합니다 — 클라이언트 측 유효성 검사에 충분합니다. 실제 서비스에서는 Email Validator를 통해 실제 이메일 전송 여부로 검증하세요.

URL

https?:\/\/[^\s/$.?#].[^\s]*

httphttps URL 모두 매칭합니다. 유효한 URL을 만들려면 URL & Query String Builder를 참고하세요.

전화번호 (미국)

\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}

(555) 123-4567, 555.123.4567, 555-123-4567 등의 형식을 매칭합니다.

날짜 (YYYY-MM-DD)

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

정규식 디버깅

가장 좋은 학습 방법은 직접 테스트해보는 것입니다. Regex Tester에 패턴과 샘플 문자열을 붙여넣어 보세요 — 실시간으로 매칭 결과를 강조 표시하고, 캡처 그룹을 보여주며, 패턴의 각 부분이 무엇을 의미하는지 설명해줍니다.

문제를 해결하는 가장 단순한 패턴을 작성하세요. "영리한" 정규식은 유지 관리하기 어렵습니다.

성능 함정

치명적인 역추적 (Catastrophic backtracking)

(a+)+b와 같이 중첩된 수량자는 매칭되지 않는 입력에 대해 엔진이 지수적으로 많은 경우의 수를 시도하게 만들 수 있습니다. 표현식의 여러 부분이 동일한 문자와 매칭될 수 있는 패턴은 피하세요.

앵커로 성능 향상

패턴이 문자열 전체와 매칭되어야 한다면 ^$를 사용하세요. 앵커 없이는 엔진이 부분 매칭을 찾기 위해 문자열의 모든 위치를 스캔합니다.

빠른 참조 치트 시트

.           임의의 문자
\d \D       숫자 / 비숫자
\w \W       단어 문자 / 비단어 문자
\s \S       공백 / 비공백
[abc]       문자 집합
[^abc]      부정 집합
(group)     캡처 그룹
(?:group)   비캡처 그룹
a{3}        정확히 3회
a{2,5}      2회 이상 5회 이하
a*? a+?     게으른(non-greedy) 버전
(?=ahead)   긍정형 전방 탐색
(?!ahead)   부정형 전방 탐색

정규식은 쌓여가는 기술입니다. 단순한 패턴부터 시작해 시각적으로 테스트하고, 필요할 때만 복잡도를 높여가세요. 모든 언어가 정규식을 지원합니다 — 한 번 문법을 익히면 어디서든 활용할 수 있습니다.