실시간으로 정규표현식을 테스트하고 매치 결과를 바로 확인하세요
정규식(Regular Expression, 줄여서 regex)은 특정 문자열 패턴을 표현하는 형식 언어입니다. 1956년 수학자 스티브 클레이니(Stephen Kleene)가 정규 언어(regular language)를 기술하기 위해 고안했으며, 현재는 프로그래밍 언어, 텍스트 에디터, 데이터베이스 등 거의 모든 소프트웨어에서 문자열 검색·치환·검증에 활용됩니다.
예를 들어, 이메일 주소처럼 생긴 문자열을 찾아내거나, 전화번호 형식을 검증하거나, 로그 파일에서 에러 메시지만 추출할 때 정규식 한 줄이면 수십 줄의 코드를 대체할 수 있습니다. 국내 개발 현장에서도 폼 유효성 검사, 주민등록번호 마스킹, 한글 필터링 등 다양한 용도로 널리 쓰입니다.
정규식의 핵심 구성 요소는 리터럴(literal), 메타문자(metacharacter), 수량자(quantifier), 그룹(group) 네 가지입니다. 이 도구를 활용해 패턴을 직접 입력하고 실시간 결과를 확인하면서 빠르게 익혀보세요.
| 용도 | 패턴 | 예시 매치 |
|---|---|---|
| 이메일 주소 | [a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,} | hong@naver.com |
| 휴대폰 번호 | 01[016789]-?\d{3,4}-?\d{4} | 010-1234-5678 |
| 일반전화 (02, 031 등) | 0\d{1,2}-?\d{3,4}-?\d{4} | 02-3456-7890 |
| 주민번호 앞 6자리 | [0-9]{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01]) | 901215 |
| 사업자등록번호 | \d{3}-?\d{2}-?\d{5} | 123-45-67890 |
| 한글만 (완성형) | [가-힣]+ | 안녕하세요 |
| 한글 + 공백 | [가-힣\s]+ | 테크 팁 KR |
| 숫자만 | \d+ | 12345 |
| 소수 포함 숫자 | \d+(\.\d+)? | 3.14 |
| 한국 날짜 (YYYY-MM-DD) | 20\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) | 2026-05-16 |
| 한국 날짜 (YYYY년 M월) | 20\d{2}년\s*(0?[1-9]|1[0-2])월 | 2026년 5월 |
| URL (http/https) | https?://[^\s/$.?#].[^\s]* | https://techtipkr.com |
| IP 주소 | (\d{1,3}\.){3}\d{1,3} | 192.168.0.1 |
| 우편번호 (5자리) | \d{5} | 06235 |
| 차량 번호판 (신형) | \d{2,3}[가-힣]\d{4} | 123가4567 |
| HTML 태그 제거 | <[^>]+> | <b>텍스트</b> |
| 공백 (여러 개) | \s{2,} | "a b" |
| 영문+숫자만 (아이디) | [a-zA-Z][a-zA-Z0-9_]{3,15} | user_01 |
| 비밀번호 강도 (8자+영숫자특수) | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{8,}$ | P@ss1234 |
| JSON 키값 추출 | "([^"]+)"\s*:\s*"([^"]+)" | "name": "홍길동" |
JavaScript에서는 리터럴 표기법(/패턴/플래그)과 RegExp 생성자 두 가지 방식을 지원합니다. 동적으로 패턴을 만들 때는 생성자를 사용하세요.
// 리터럴 표기법 const regex = /01[016789]-?\d{3,4}-?\d{4}/g; const text = "연락처: 010-1234-5678, 011-987-6543"; const matches = [...text.matchAll(regex)]; console.log(matches.length); // 2 // 생성자 방식 (동적 패턴) const keyword = "테크팁"; const re = new RegExp(keyword, 'gi'); text.replace(re, '<mark>$&</mark>'); // 하이라이트
Python의 re 모듈은 표준 라이브러리에 포함되어 있으며, 컴파일 후 재사용하면 성능이 향상됩니다.
import re # 이메일 추출 pattern = r'[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}' text = "문의: hong@naver.com, info@techtipkr.com" emails = re.findall(pattern, text) print(emails) # ['hong@naver.com', 'info@techtipkr.com'] # 치환: 전화번호 마스킹 masked = re.sub(r'(\d{3})-\d{4}-(\d{4})', r'\1-****-\2', "010-1234-5678") print(masked) # 010-****-5678
Java에서는 java.util.regex 패키지의 Pattern과 Matcher 클래스를 사용합니다.
import java.util.regex.*; String text = "주문번호: ORD-20260516-001"; Pattern p = Pattern.compile("ORD-(\\d{8})-(\\d{3})"); Matcher m = p.matcher(text); if (m.find()) { System.out.println(m.group(1)); // 20260516 (날짜) System.out.println(m.group(2)); // 001 (순번) }
네이버 블로그 URL은 https://blog.naver.com/{블로그ID}/{글번호} 형식입니다. 아래 정규식으로 블로그 ID와 글 번호를 한 번에 추출할 수 있습니다.
패턴: blog\.naver\.com/([a-zA-Z0-9_]+)/(\d+)
입력: https://blog.naver.com/techtipkr/123456789
그룹 1: techtipkr
그룹 2: 123456789
수천 줄의 Nginx 로그에서 HTTP 500 에러만 빠르게 추출할 때 정규식이 필수입니다.
패턴: (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+\s500\s Python 예: import re with open('/var/log/nginx/access.log') as f: errors = [line for line in f if re.search(r'\s500\s', line)]
실무에서 가장 자주 쓰이는 폼 검증 코드입니다. 한국 휴대폰 번호와 이메일을 동시에 검증합니다.
function validateForm(phone, email) { const phoneRe = /^01[016789]-?\d{3,4}-?\d{4}$/; const emailRe = /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/; return { phoneOk: phoneRe.test(phone), emailOk: emailRe.test(email) }; } validateForm("010-1234-5678", "hong@naver.com"); // { phoneOk: true, emailOk: true }