온라인 정규식 테스터를 사용하면 정규표현식을 작성하고 샘플 텍스트를 붙여넣어 매치를 실시간으로 강조 표시할 수 있습니다 — 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의 정규식 테스터는 분할 패널 에디터를 제공합니다. 왼쪽에서 패턴을 작성하고 오른쪽에 샘플 텍스트를 붙여넣습니다. 매치가 실시간으로 강조되고, 캡처 그룹이 아래에 표시되며, 한 번의 클릭으로 플래그를 토글할 수 있습니다.
설치 불필요. 속도 제한 없음. 완전히 브라우저에서 실행됩니다.