작성일 댓글 남기기

정규표현식 실전 입문 – 자주 쓰는 패턴 20가지 총정리

basic syntax

개발 업무를 하다 보면 ‘이메일 형식이 맞는지 확인해 줘’, ‘전화번호만 뽑아줘’, ‘특정 패턴의 로그만 필터링해 줘’ 같은 요청을 자주 받습니다. 이 모든 작업의 공통 해법이 바로 정규표현식(Regular Expression, Regex)입니다. 처음 보면 외계어처럼 느껴지지만, 핵심 문법 10개만 익히면 텍스트 처리 속도가 체감될 정도로 빨라집니다.

이 글에서는 정규표현식을 처음 접하는 분도 바로 실무에 쓸 수 있도록, 기본 문법부터 실전 패턴 20가지, 그리고 VS Code·JavaScript·Python에서의 활용법까지 한 번에 정리합니다.

정규표현식이란 무엇인가

정규표현식은 텍스트에서 특정 패턴을 찾거나 치환하기 위한 일종의 검색 언어입니다. 1950년대 수학자 스티븐 클레이니가 정규 언어 이론에서 처음 제안했고, 이후 유닉스의 grep 명령어에 적용되면서 프로그래밍 세계에 자리 잡았습니다.

오늘날 정규표현식은 거의 모든 프로그래밍 언어, 텍스트 에디터, 데이터베이스에서 지원됩니다. VS Code의 찾기/바꾸기, 구글 스프레드시트의 REGEXMATCH 함수, 심지어 워드프레스의 리다이렉트 규칙까지, 한번 익혀두면 활용처가 끝이 없습니다.

정규표현식의 핵심 가치는 세 가지입니다.

  • 검증(Validation): 사용자 입력이 올바른 형식인지 확인 (이메일, 전화번호, 우편번호 등)
  • 추출(Extraction): 긴 텍스트에서 원하는 정보만 뽑아내기 (로그 파일에서 IP 주소, HTML에서 URL 등)
  • 치환(Replacement): 특정 패턴을 다른 텍스트로 일괄 교체 (날짜 형식 변환, 코드 리팩토링 등)

5분 만에 끝내는 기본 문법

정규표현식의 문법 전체를 외울 필요는 없습니다. 아래 10가지 핵심 요소만 알면 실무 패턴의 90%를 커버할 수 있습니다.

basic syntax

문자 매칭 기본

일반 문자는 그 자체를 의미합니다. abc라고 쓰면 텍스트에서 정확히 ‘abc’라는 문자열을 찾습니다. 대소문자를 구분하므로, 대소문자를 무시하려면 플래그 i를 붙여야 합니다.

메타문자는 특별한 의미를 가진 문자입니다. . ^ $ * + ? { } [ ] \ | ( ) 이 12개가 메타문자이며, 이 문자를 문자 그대로 찾으려면 앞에 역슬래시(\)를 붙입니다. 예를 들어 마침표를 찾으려면 \.이라고 씁니다.

문자 클래스와 약어

대괄호 [ ] 안에 문자를 나열하면 그중 하나와 매칭됩니다. [aeiou]는 모음 하나를, [0-9]는 숫자 하나를, [a-zA-Z]는 영문자 하나를 의미합니다. 대괄호 안에서 ^는 부정을 뜻해서, [^0-9]는 숫자가 아닌 문자를 의미합니다.

자주 쓰는 문자 클래스는 축약형이 있습니다.

  • \d[0-9] (숫자)
  • \D[^0-9] (숫자 아닌 것)
  • \w[a-zA-Z0-9_] (단어 문자)
  • \W[^a-zA-Z0-9_] (단어 문자 아닌 것)
  • \s → 공백 문자 (스페이스, 탭, 줄바꿈)
  • \S → 공백이 아닌 문자
  • . → 줄바꿈을 제외한 모든 문자

수량자 (Quantifier)

패턴이 몇 번 반복되는지를 지정합니다.

  • * → 0회 이상 (없어도 되고, 여러 번이어도 됨)
  • + → 1회 이상 (최소 한 번은 있어야 함)
  • ? → 0회 또는 1회 (있어도 되고 없어도 됨)
  • {3} → 정확히 3회
  • {2,5} → 2회 이상 5회 이하
  • {3,} → 3회 이상

수량자는 기본적으로 탐욕적(Greedy)으로 동작합니다. 가능한 한 많이 매칭하려고 합니다. 뒤에 ?를 붙이면 게으른(Lazy) 모드가 되어 가능한 한 적게 매칭합니다. 예를 들어 <.+><div>hello</div> 전체를 잡지만, <.+?><div>만 잡습니다.

앵커와 경계

  • ^ → 문자열(또는 줄)의 시작
  • $ → 문자열(또는 줄)의 끝
  • \b → 단어 경계 (예: \bcat\b는 ‘cat’은 매칭하지만 ‘category’는 매칭하지 않음)

그룹과 캡처

소괄호 ( )로 묶으면 그룹이 되고, 매칭된 내용을 캡처하여 뒤에서 참조할 수 있습니다. (\d{4})-(\d{2})-(\d{2})로 날짜를 매칭하면, 그룹 1은 연도, 그룹 2는 월, 그룹 3은 일이 됩니다. 치환할 때 $1, $2, $3으로 각 그룹을 참조할 수 있어서 날짜 형식을 자유롭게 바꿀 수 있습니다.

파이프 |는 OR 연산자입니다. (cat|dog)은 ‘cat’ 또는 ‘dog’을 매칭합니다.

실전에서 바로 쓰는 패턴 20가지

아래 패턴들은 실무에서 가장 자주 등장하는 것들을 엄선했습니다. 각 패턴의 동작 원리를 이해하면 응용도 어렵지 않습니다.

pattern card

패턴 1 – 이메일 주소

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

@ 앞쪽에 영문·숫자·특수문자 조합, @ 뒤쪽에 도메인, 마지막에 최상위 도메인(2자 이상)을 매칭합니다. RFC 5322 완벽 준수는 아니지만 실무 99%를 커버합니다. 사용자 입력 검증, 텍스트에서 이메일 추출, 스팸 필터링 등에 활용됩니다.

패턴 2 – 한국 휴대전화번호

01[016789]-?\d{3,4}-?\d{4}

010, 011, 016, 017, 018, 019로 시작하는 번호를 하이픈 유무에 관계없이 매칭합니다. -?가 하이픈이 있어도 되고 없어도 되게 처리합니다. 고객 데이터 정제, 전화번호 형식 통일 등에 유용합니다.

패턴 3 – 한국 일반 전화번호

0\d{1,2}-?\d{3,4}-?\d{4}

02(서울), 031(경기) 등 지역번호로 시작하는 유선 전화번호를 매칭합니다. 지역번호 길이가 2~3자리로 다양하므로 \d{1,2}로 유연하게 처리합니다.

패턴 4 – URL 추출

https?://[^\s<>"']+

http:// 또는 https://로 시작하고, 공백이나 꺾쇠·따옴표가 나올 때까지의 문자열을 매칭합니다. 로그 파일, 채팅 기록, 문서에서 링크를 일괄 추출할 때 편리합니다.

패턴 5 – IPv4 주소

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

점으로 구분된 4개의 숫자 그룹을 매칭합니다. 단어 경계(\b)로 감싸서 더 긴 숫자 안의 부분 매칭을 방지합니다. 서버 로그 분석, 네트워크 관리, 보안 감사에서 IP 추출 시 사용합니다.

패턴 6 – 날짜 (YYYY-MM-DD)

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

ISO 8601 형식 날짜를 매칭합니다. 월은 01~12, 일은 01~31 범위를 정규표현식 레벨에서 제한합니다. 로그 파일 날짜 추출, CSV 데이터 검증에 활용됩니다.

패턴 7 – 시간 (HH:MM:SS)

([01]\d|2[0-3]):[0-5]\d:[0-5]\d

24시간 형식의 시간을 매칭합니다. 시는 00~23, 분과 초는 00~59 범위입니다. 서버 로그 타임스탬프 파싱에 자주 씁니다.

패턴 8 – 한글만 매칭

[가-힣]+

완성형 한글 음절(가~힣) 범위를 이용해 한글 단어를 매칭합니다. 자모 단위까지 포함하려면 [ㄱ-ㅎㅏ-ㅣ가-힣]을 사용합니다. 한글/영문 분리, 한글 이름 검증 등에 유용합니다.

패턴 9 – 주민등록번호 마스킹

(\d{6})-?(\d{7})

앞 6자리(생년월일)와 뒤 7자리를 캡처합니다. 치환 시 $1-*******로 바꾸면 뒷자리를 마스킹할 수 있습니다. 개인정보 보호법 준수를 위한 데이터 비식별화 작업에 필수적인 패턴입니다.

패턴 10 – 우편번호 (5자리)

\b\d{5}\b

2015년 이후 대한민국 우편번호 체계인 5자리 숫자를 매칭합니다. 단어 경계로 감싸서 더 긴 숫자열의 일부가 잡히는 것을 방지합니다.

패턴 11 – 금액 (천단위 쉼표 포함)

\d{1,3}(,\d{3})*(\.\d{1,2})?

1,234,567이나 99.99 같은 금액 형식을 매칭합니다. 천단위 쉼표가 0개 이상, 소수점 이하 1~2자리는 선택적입니다. 재무 데이터 파싱, 크롤링 데이터 정제에 활용됩니다.

패턴 12 – HTML 태그 제거

<[^>]+>

꺾쇠 안의 모든 내용을 매칭합니다. 치환 시 빈 문자열로 바꾸면 HTML 태그를 일괄 제거할 수 있습니다. 웹 크롤링 결과에서 순수 텍스트만 뽑을 때 자주 사용합니다. 단, 복잡한 HTML 파싱에는 전용 파서를 쓰는 것이 안전합니다.

패턴 13 – 비밀번호 강도 검증

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

전방 탐색(Lookahead)을 활용한 고급 패턴입니다. 소문자·대문자·숫자·특수문자가 각각 최소 1개 포함되고, 전체 길이 8자 이상을 요구합니다. (?=.*[a-z])는 ‘문자열 어딘가에 소문자가 있어야 한다’는 조건입니다. 회원가입 폼 검증에 필수입니다.

패턴 14 – 사업자등록번호

\d{3}-?\d{2}-?\d{5}

3자리-2자리-5자리 형식의 사업자등록번호를 매칭합니다. 하이픈 유무에 관계없이 동작합니다. 세금계산서 데이터 처리, B2B 서비스 입력 검증에 사용됩니다.

패턴 15 – 연속 공백을 하나로 축소

\s{2,}

2개 이상 연속된 공백 문자를 매칭합니다. 치환 시 공백 하나( )로 바꾸면 텍스트를 깔끔하게 정리할 수 있습니다. 데이터 정제, 텍스트 전처리의 기본 패턴입니다.

패턴 16 – 파일 확장자 추출

\.([a-zA-Z0-9]+)$

문자열 끝에 위치한 점(.) 뒤의 확장자를 캡처합니다. 파일 목록 필터링, 업로드 파일 형식 검증에 활용합니다. 특정 확장자만 허용하려면 \.(jpg|png|gif|webp)$처럼 명시합니다.

패턴 17 – 카멜케이스를 스네이크케이스로 변환

([a-z])([A-Z])

소문자 뒤에 대문자가 오는 지점을 찾습니다. 치환 시 $1_$2로 바꾸고 전체를 소문자로 변환하면 camelCasecamel_case가 됩니다. 코드 스타일 변환, API 응답 키 변환에 유용합니다.

패턴 18 – 로그 레벨 필터링

^\[(ERROR|WARN|INFO|DEBUG)\]

줄 시작에 대괄호로 감싼 로그 레벨을 매칭합니다. ERROR만 보고 싶으면 ^\[ERROR\]로 쓰면 됩니다. 서버 장애 대응 시 대량 로그에서 에러만 빠르게 필터링할 때 필수입니다.

패턴 19 – JSON 키-값 추출

"(\w+)"\s*:\s*"([^"]*?)"

JSON 문자열에서 키와 값 쌍을 캡처합니다. 그룹 1이 키, 그룹 2가 값입니다. 간단한 설정 파일 파싱이나 로그에 포함된 JSON 조각 분석에 씁니다. 물론 복잡한 JSON은 전용 파서를 사용해야 합니다.

패턴 20 – 중복 단어 제거

\b(\w+)\s+\1\b

같은 단어가 연속으로 두 번 나오는 것을 매칭합니다. \1은 첫 번째 캡처 그룹과 동일한 텍스트를 의미하는 역참조(Backreference)입니다. 문서 교정, 오타 검출에 활용합니다. 치환 시 $1로 바꾸면 중복이 제거됩니다.

개발 도구별 정규표현식 활용법

패턴을 알아도 어디서 어떻게 쓰는지 모르면 소용이 없습니다. 가장 많이 사용하는 세 가지 환경에서의 활용법을 정리합니다.

tools usage

VS Code에서 정규표현식 검색·치환

VS Code의 찾기/바꾸기(Ctrl+H)에서 정규표현식 모드를 활성화하면(버튼 .* 클릭 또는 Alt+R) 파일 내 패턴 검색과 치환이 가능합니다.

실전 예시를 몇 가지 들어보겠습니다. console\.log\(.*?\);로 검색하면 코드에 남아있는 디버깅용 console.log를 한 번에 찾아서 제거할 수 있습니다. (\d{4})/(\d{2})/(\d{2})$1-$2-$3으로 치환하면 날짜 형식을 슬래시에서 하이픈으로 일괄 변경할 수 있습니다.

‘파일에서 찾기'(Ctrl+Shift+H)를 사용하면 프로젝트 전체에서 정규표현식 검색·치환이 가능하여 대규모 리팩토링에 매우 강력합니다. 파일 포함/제외 패턴과 함께 사용하면 원하는 범위만 정확하게 처리할 수 있습니다.

JavaScript에서 정규표현식 사용

JavaScript는 정규표현식을 언어 수준에서 지원합니다. 리터럴 방식 /패턴/플래그와 생성자 방식 new RegExp('패턴', '플래그') 두 가지로 만들 수 있습니다.

가장 자주 쓰는 메서드는 다음과 같습니다.

  • test() — 매칭 여부를 true/false로 반환: /^\d+$/.test('123')true
  • match() — 매칭 결과를 배열로 반환: '2026-05-20'.match(/(\d{4})-(\d{2})-(\d{2})/)
  • replace() — 패턴 치환: 'Hello World'.replace(/(\w+)\s(\w+)/, '$2 $1')'World Hello'
  • matchAll() — 모든 매칭을 이터레이터로 반환 (글로벌 플래그 g 필요)

플래그도 알아두면 좋습니다. g(글로벌 — 첫 매칭 이후에도 계속 검색), i(대소문자 무시), m(멀티라인 — ^와 $가 각 줄에 적용), s(dotAll — .이 줄바꿈도 매칭)가 실무에서 자주 쓰입니다.

Python에서 정규표현식 사용

Python의 re 모듈은 정규표현식 기능을 제공합니다. 패턴 앞에 r 접두사를 붙여 원시 문자열(raw string)로 쓰는 것이 관례입니다. 역슬래시가 이스케이프되지 않아서 패턴을 직관적으로 쓸 수 있습니다.

핵심 함수는 네 가지입니다.

  • re.search(r'패턴', 텍스트) — 첫 번째 매칭을 찾아 Match 객체 반환
  • re.findall(r'패턴', 텍스트) — 모든 매칭을 리스트로 반환
  • re.sub(r'패턴', '치환값', 텍스트) — 패턴 치환
  • re.compile(r'패턴') — 패턴을 미리 컴파일하여 반복 사용 시 성능 향상

Python에서 자주 사용하는 실전 예시로, 로그 파일에서 IP와 상태 코드를 추출하는 코드를 살펴보겠습니다. re.findall(r'(\d+\.\d+\.\d+\.\d+).*?\s(\d{3})\s', log_text)처럼 쓰면 IP 주소와 HTTP 상태 코드 쌍을 리스트로 한 번에 뽑아낼 수 있습니다.

온라인 테스트 도구와 학습 자원

정규표현식을 배울 때 가장 효과적인 방법은 직접 패턴을 입력하고 실시간으로 매칭 결과를 확인하는 것입니다. 추천 도구를 소개합니다.

regex101.com은 가장 인기 있는 정규표현식 테스트 사이트입니다. 패턴을 입력하면 실시간으로 매칭 결과를 하이라이트해 주고, 오른쪽에 각 토큰의 의미를 자연어로 설명해 줍니다. JavaScript, Python, Go, Java 등 언어별 엔진을 선택할 수 있어서 언어 간 미묘한 차이도 바로 확인할 수 있습니다. 패턴을 저장하고 공유하는 기능도 있어서 팀원과 협업할 때 편리합니다.

regexr.com은 좀 더 시각적인 인터페이스를 제공합니다. 매칭 결과를 색상으로 구분하고, 커뮤니티에서 공유한 패턴 라이브러리가 있어서 다른 사람의 패턴을 참고하기 좋습니다.

debuggex.com은 정규표현식을 철도 다이어그램(railroad diagram)으로 시각화해 줍니다. 복잡한 패턴의 구조를 한눈에 파악할 때 유용합니다.

practice tools

학습 측면에서는 regexone.com이 인터랙티브 튜토리얼로 단계별 연습 문제를 제공합니다. 처음 배우는 분에게 추천합니다. regexcrossword.com은 정규표현식으로 크로스워드 퍼즐을 푸는 사이트로, 게임처럼 즐기며 실력을 키울 수 있습니다.

정규표현식 성능과 주의사항

정규표현식은 강력하지만, 잘못 쓰면 성능 문제를 일으킬 수 있습니다. 특히 서버 사이드에서 사용자 입력에 정규표현식을 적용할 때는 ReDoS(Regular Expression Denial of Service) 공격에 주의해야 합니다.

재앙적 역추적 피하기

(a+)+$ 같은 패턴에 aaaaaaaaaaaaaaaaX를 입력하면, 엔진이 가능한 모든 조합을 시도하면서 지수적으로 시간이 폭발합니다. 이를 재앙적 역추적(Catastrophic Backtracking)이라 부릅니다.

예방 방법은 간단합니다. 중첩된 수량자(수량자 안에 수량자)를 피하고, 가능하면 패턴을 구체적으로 작성하세요. .* 대신 [^특정문자]*처럼 매칭 범위를 제한하면 역추적이 크게 줄어듭니다. 또한 JavaScript의 경우 d 플래그(ES2022)와 함께 타임아웃을 설정하는 것이 안전합니다.

정규표현식이 적합하지 않은 경우

완전한 HTML/XML 파싱, 중첩 괄호 매칭, 복잡한 문법 분석은 정규표현식의 한계를 넘어서는 작업입니다. 이런 경우에는 전용 파서 라이브러리를 사용하세요. 정규표현식은 정규 언어(Regular Language)만 처리할 수 있고, 중첩 구조가 있는 문맥 자유 언어(Context-Free Language)는 원리적으로 처리할 수 없습니다.

실무 원칙은 이렇습니다. 단순한 텍스트 패턴 매칭에는 정규표현식, 구조화된 데이터 파싱에는 전용 파서를 쓰세요. 정규표현식이 5줄 이상으로 길어지면 코드로 로직을 분리하는 것이 유지보수에 유리합니다.

현업에서 정규표현식을 활용하는 실전 시나리오

패턴과 도구를 배웠으니 실제 업무에서 어떻게 쓰이는지 구체적인 시나리오로 살펴보겠습니다.

시나리오 1 — 로그 파일 분석

서버에서 500 에러가 급증했을 때, 수천 줄의 로그에서 에러만 빠르게 필터링해야 합니다. 터미널에서 grep -P '\[ERROR\].*500' access.log 한 줄이면 해당 로그만 추출됩니다. 여기에 IP 추출 패턴을 파이프로 연결하면 어떤 IP에서 에러가 집중되는지도 바로 확인할 수 있습니다.

시나리오 2 — 데이터 정제

크롤링한 상품 가격 데이터에 ‘₩1,234,567원’, ‘1234567’, ‘1,234,567 원’ 등 다양한 형식이 섞여 있을 때, [₩원\s,]를 제거하고 순수 숫자만 남기면 통일된 데이터셋을 얻을 수 있습니다. Python의 re.sub으로 한 줄이면 됩니다.

시나리오 3 — 코드 리팩토링

프로젝트 전체에서 console.loglogger.debug로 바꿔야 할 때, VS Code의 정규표현식 치환으로 console\.log\((.*)\)logger.debug($1)로 일괄 변환할 수 있습니다. 수백 개 파일을 하나하나 수정하지 않아도 됩니다.

시나리오 4 — 개인정보 비식별화

고객 데이터에서 주민등록번호 뒷자리를 마스킹하거나, 신용카드 번호 중간 8자리를 가리는 작업도 정규표현식 치환으로 자동화할 수 있습니다. 수작업으로 처리하면 누락 위험이 있지만, 정규표현식은 패턴에 맞는 모든 데이터를 빠짐없이 처리합니다.

마무리 — 하루 10분, 2주면 정규표현식이 손에 익습니다

정규표현식은 프로그래밍 언어가 바뀌어도, 도구가 바뀌어도 계속 쓸 수 있는 보편적 기술입니다. 한번 익혀두면 커리어 전체에 걸쳐 시간을 절약해 주는 몇 안 되는 기술 중 하나입니다.

처음부터 모든 패턴을 외우려 하지 마세요. 이 글에서 소개한 20가지 패턴 중 본인 업무에 해당하는 3~5개만 먼저 직접 regex101에서 테스트해 보세요. 패턴이 매칭되는 순간의 쾌감이 다음 패턴을 익히는 동력이 됩니다.

복잡한 패턴이 필요할 때는 처음부터 한 번에 만들지 말고, 간단한 패턴에서 시작해서 조건을 하나씩 추가하는 방식으로 쌓아가세요. 디버깅도 쉽고, 다른 사람이 읽기에도 좋습니다. 정규표현식은 작성보다 읽기가 어려운 도구이므로, 복잡한 패턴에는 주석(x 플래그)을 달아두는 습관도 추천합니다.

오늘 소개한 기본 문법과 패턴 20가지, 그리고 VS Code·JavaScript·Python 활용법만 있으면 실무에서 만나는 대부분의 텍스트 처리 문제를 해결할 수 있습니다. 이제 regex101을 열고 첫 번째 패턴부터 직접 만들어 보세요.

이미지는 Claude AI 로 생성되었습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다