온라인 정규식 테스터를 사용하면 정규표현식을 작성하고 샘플 텍스트를 붙여넣어 매치를 실시간으로 강조 표시할 수 있습니다 — IDE, 터미널, 시행착오 커밋 사이클이 전혀 필요 없습니다. “거의 작동하는” 정규식을 디버깅하는 것은 개발에서 가장 힘든 경험 중 하나이지만, 인터랙티브 테스터를 사용하면 시각적이고 이해하기 쉬운 과정으로 바뀝니다.

지금 정규식 테스트하기 →

온라인 정규식 테스터를 쓰는 이유

정규표현식은 외워서 읽고 쓰기가 악명높이 어렵습니다. 온라인 테스터를 사용하면:

  • 즉각적인 피드백 — 입력하면서 텍스트의 어느 부분이 매칭되는지 확인
  • 플래그 제어 — 코드를 다시 작성하지 않고 g, i, m, s 플래그 토글
  • 캡처 그룹 확인 — 각 () 그룹이 캡처한 내용을 정확히 확인
  • 안전한 반복 — 프로덕션 코드를 건드리지 않고 실험

정규식 플래그

플래그는 패턴이 매칭되는 방식을 변경합니다. 이것들을 이해하면 가장 일반적인 정규식 버그를 방지할 수 있습니다:

플래그의미
g전역 — 첫 번째만이 아닌 모든 매치 검색
i대소문자 무시 — [A-Z][a-z]에도 매칭
m다중행 — ^$가 각 줄의 시작/끝에 매칭
s점 전부 — .이 줄바꿈 문자에도 매칭
u유니코드 — 완전한 유니코드 매칭 활성화
d인덱스 — 매치 그룹의 시작/끝 인덱스 포함

가장 흔한 실수: 여러 매치를 기대할 때 g 플래그를 잊는 것.

핵심 정규식 문법

문자 클래스

\d        — 모든 숫자 [0-9]
\D        — 숫자가 아닌 것
\w        — 단어 문자 [a-zA-Z0-9_]
\W        — 비단어 문자
\s        — 공백 (스페이스, 탭, 줄바꿈)
\S        — 비공백
.         — 줄바꿈 제외 모든 문자 (s 플래그로 줄바꿈 포함)
[abc]     — 문자 클래스: a, b, 또는 c
[^abc]    — 부정 클래스: a, b, c 제외 모든 것
[a-z]     — 범위: 소문자 a부터 z
[a-zA-Z] — 범위: 모든 알파벳

수량자

*         — 0회 이상 (탐욕적)
+         — 1회 이상 (탐욕적)
?         — 0 또는 1회 (선택적)
{3}       — 정확히 3회
{3,}      — 3회 이상
{3,6}     — 3~6회 (포함)
*?        — 0회 이상 (게으른/비탐욕적)
+?        — 1회 이상 (게으른/비탐욕적)

탐욕적 vs 게으른: <a>foo</a>에서 <.+>는 전체 문자열에 매칭됩니다. <.+?><a></a>에 각각 매칭됩니다.

앵커

^         — 문자열 시작 (m 플래그로 각 줄 시작)
$         — 문자열 끝 (m 플래그로 각 줄 끝)
\b        — 단어 경계
\B        — 비단어 경계

그룹과 캡처

(abc)     — 캡처 그룹: "abc"를 그룹 1로 캡처
(?:abc)   — 비캡처 그룹: 그룹화하지만 캡처하지 않음
(?<name>abc) — 이름 있는 캡처 그룹: groups.name으로 접근
(a|b)     — 선택: "a" 또는 "b"에 매칭

전방 탐색과 후방 탐색

(?=abc)   — 긍정 전방 탐색: "abc"가 뒤따름
(?!abc)   — 부정 전방 탐색: "abc"가 뒤따르지 않음
(?<=abc)  — 긍정 후방 탐색: "abc"가 앞에 있음
(?<!abc)  — 부정 후방 탐색: "abc"가 앞에 없음

탐색은 문자가 아닌 위치에 매칭됩니다 — 입력을 소비하지 않습니다.

실용적인 정규식 패턴

이메일 주소 유효성 검사

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

일반적인 경우를 커버합니다. 완전한 RFC 5321 준수 이메일 정규식은 비실용적입니다 — 프로덕션에서는 라이브러리나 간단한 형식 확인 + 확인 이메일을 사용하세요.

URL 매칭

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

http://https:// URL에 매칭됩니다. 더 엄격한 검증:

^(https?:\/\/)([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(\/[^\s]*)?$

IPv4 주소

^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$

각 옥텟이 0~255임을 검증합니다.

시맨틱 버전 (semver)

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z\-][0-9a-zA-Z\-]*))*))?(?:\+([0-9a-zA-Z\-]+(?:\.[0-9a-zA-Z\-]+)*))?$

프리릴리스와 빌드 메타데이터를 포함한 완전한 semver 준수.

ISO 8601 날짜

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

기본 범위 검증이 있는 YYYY-MM-DD 형식에 매칭됩니다.

텍스트에서 숫자 추출

-?\d+(?:\.\d+)?

정수와 소수, 선택적으로 음수에 매칭됩니다. 로그 출력이나 설정 파일 파싱에 유용합니다.

16진수 색상 코드

#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\b

3자리(#fff)와 6자리(#ffffff) 16진수 색상 모두에 매칭됩니다.

로그 줄 파싱

^(?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})\s+(?<level>ERROR|WARN|INFO|DEBUG)\s+(?<message>.+)$

이름 있는 캡처 그룹으로 비구조화 로그 줄에서 구조화된 데이터를 얻습니다.

코드에서 정규식 사용

JavaScript

// 기본 매치
const email = 'user@example.com';
const pattern = /^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$/;
console.log(pattern.test(email)); // true

// 모든 매치 추출 (g 플래그 필요)
const text = 'Prices: $12.50, $199, $0.99';
const prices = text.match(/\$\d+(?:\.\d{2})?/g);
// ['$12.50', '$199', '$0.99']

// 이름 있는 캡처 그룹
const log = '2026-04-07T14:23:01 ERROR connection refused';
const logPattern = /^(?<ts>\S+)\s+(?<level>\w+)\s+(?<msg>.+)$/;
const { ts, level, msg } = log.match(logPattern).groups;

// 역참조로 교체
const camelToSnake = str => str.replace(/([A-Z])/g, '_$1').toLowerCase();
camelToSnake('camelCaseString'); // 'camel_case_string'

Python

import re

# 검색과 추출
text = "Order #12345 placed on 2026-04-07"
m = re.search(r'#(\d+)', text)
if m:
    print(m.group(1))  # '12345'

# 모든 매치 찾기
emails = re.findall(r'[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}', text)

# 이름 있는 그룹
pattern = re.compile(
    r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
)
m = pattern.search(text)
print(m.group('year'), m.group('month'), m.group('day'))

# 치환
result = re.sub(r'\b(\w+)\b', lambda m: m.group().upper(), 'hello world')
# 'HELLO WORLD'

Go

import "regexp"

// 한 번 컴파일하고 재사용
emailRe := regexp.MustCompile(`^[\w.%+\-]+@[\w\-]+\.[a-zA-Z]{2,}$`)
fmt.Println(emailRe.MatchString("user@example.com")) // true

// 전체 찾기
re := regexp.MustCompile(`\$\d+(?:\.\d{2})?`)
matches := re.FindAllString("Prices: $12.50 and $199", -1)
// ["$12.50", "$199"]

// 이름 있는 서브매치
re = regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})`)
match := re.FindStringSubmatch("2026-04")
names := re.SubexpNames()
// names를 반복하여 매치에 이름 매핑

흔한 정규식 실수

특수 문자 이스케이프 누락., *, +, ?, (, ), [, ], {, }, ^, $, |, \는 메타 문자입니다. 리터럴 점에 매칭하려면 \.로 씁니다.

게으른 수량자가 필요한 곳에 탐욕적 사용<.+>는 첫 번째 <부터 마지막 >까지 모든 것에 매칭됩니다. 개별 태그에 매칭하려면 <.+?>를 사용합니다.

JavaScript에서 g 플래그 누락string.match(/pattern/)g 없이는 첫 번째 매치만 반환합니다. 모든 매치에는 g를 추가합니다.

다중행 텍스트에서 m 플래그 없이 ^$ 사용m 없이 ^는 문자열 전체의 시작에만 매칭되고 각 줄의 시작에는 매칭되지 않습니다.

카타스트로픽 백트래킹(a+)+ 같은 패턴을 매칭되지 않는 긴 문자열에 사용하면 지수 시간 복잡도가 발생할 수 있습니다. 겹치는 문자 클래스에 중첩 수량자를 피하세요.

이메일 유효성 검사 과잉 설계 — 표준 RFC 준수 이메일 정규식은 6,000자 이상이며 그래도 모든 잘못된 이메일을 방지하지 못합니다. 형식 확인 + 확인 이메일을 사용하세요.

정규식을 인터랙티브하게 테스트

ZeroTool의 정규식 테스터는 분할 패널 에디터를 제공합니다. 왼쪽에서 패턴을 작성하고 오른쪽에 샘플 텍스트를 붙여넣습니다. 매치가 실시간으로 강조되고, 캡처 그룹이 아래에 표시되며, 한 번의 클릭으로 플래그를 토글할 수 있습니다.

설치 불필요. 속도 제한 없음. 완전히 브라우저에서 실행됩니다.

정규식 테스터 열기 →