정규식 패턴 입력
/ /
테스트 문자열
매치 수: -
입력 길이: 0
캡처 그룹: -
매치 결과 (노란색 하이라이트)
결과가 여기에 표시됩니다...

정규식(정규표현식)이란?

정규식(Regular Expression, 줄여서 regex)은 특정 문자열 패턴을 표현하는 형식 언어입니다. 1956년 수학자 스티브 클레이니(Stephen Kleene)가 정규 언어(regular language)를 기술하기 위해 고안했으며, 현재는 프로그래밍 언어, 텍스트 에디터, 데이터베이스 등 거의 모든 소프트웨어에서 문자열 검색·치환·검증에 활용됩니다.

예를 들어, 이메일 주소처럼 생긴 문자열을 찾아내거나, 전화번호 형식을 검증하거나, 로그 파일에서 에러 메시지만 추출할 때 정규식 한 줄이면 수십 줄의 코드를 대체할 수 있습니다. 국내 개발 현장에서도 폼 유효성 검사, 주민등록번호 마스킹, 한글 필터링 등 다양한 용도로 널리 쓰입니다.

정규식의 핵심 구성 요소는 리터럴(literal), 메타문자(metacharacter), 수량자(quantifier), 그룹(group) 네 가지입니다. 이 도구를 활용해 패턴을 직접 입력하고 실시간 결과를 확인하면서 빠르게 익혀보세요.

자주 쓰는 정규식 패턴 20가지 (한국 특화)

용도패턴예시 매치
이메일 주소[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

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

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에서는 java.util.regex 패키지의 PatternMatcher 클래스를 사용합니다.

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 (순번)
}

실전 예시

1. 네이버 블로그 URL에서 블로그 ID 추출

네이버 블로그 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

2. 서버 로그 파싱 (Nginx 에러 추출)

수천 줄의 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)]

3. 회원가입 폼 유효성 검사 (한국 특화)

실무에서 가장 자주 쓰이는 폼 검증 코드입니다. 한국 휴대폰 번호와 이메일을 동시에 검증합니다.

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 }

FAQ

g 플래그를 빼면 어떻게 되나요?
g(global) 플래그 없이 match()를 사용하면 첫 번째 매치만 반환합니다. 이 도구에서는 g 플래그가 없어도 내부적으로 전체 매치 개수를 계산하지만, 하이라이트 결과에서 첫 번째 매치만 강조됩니다. 실무에서는 대부분 g 플래그를 함께 사용합니다.
입력한 정규식 데이터가 서버로 전송되나요?
아니요. 모든 처리는 브라우저(JavaScript)에서만 이루어집니다. 서버로 전송되지 않으므로 개인정보가 포함된 테스트 문자열도 안심하고 입력할 수 있습니다.
한글 범위를 정규식으로 어떻게 표현하나요?
유니코드 상에서 한글 완성형 글자는 가(U+AC00)부터 힣(U+D7A3) 범위에 있습니다. 따라서 [가-힣]으로 한글 완성형 문자 하나를 표현할 수 있습니다. 자음·모음 단독 문자(ㄱ-ㅎ, ㅏ-ㅣ)는 [ㄱ-ㅎㅏ-ㅣ]로 별도 지정해야 합니다.

🛠 다른 도구도 사용해보세요