~ / developer / regex-tester

/.*/ Regex Lab

타이핑하는 즉시 매칭 결과를 보여주는 정규식 테스터. JavaScript(ECMAScript) 문법 기준.

광고
광고
/ /
ready.
test string
highlight0 matches
matches & groups
replace
→
cheatsheet — 클릭하면 패턴에 삽입
광고

사용법

  1. / … / 사이 입력칸에 패턴을 씁니다. 슬래시는 따로 입력하지 않아도 됩니다.
  2. 위쪽 체크박스로 플래그 g i m s u를 켜고 끕니다(기본은 g).
  3. test string에 텍스트를 넣으면 highlight에 일치 부분이 칠해지고, 오른쪽 위에 매칭 개수가 나옵니다.
  4. matches & groups 표에서 각 매칭의 위치(@index)와 캡처 그룹 $1, 이름 그룹 <name> 값을 확인합니다.
  5. replace에 치환 문자열을 넣으면 String.replace 결과를 바로 미리 봅니다.
  6. 하단 cheatsheet 항목을 클릭하면 커서 위치에 해당 문법이 삽입됩니다. sample은 이메일 추출 예제를 불러옵니다.

정규표현식이란?

정규표현식(Regular Expression)은 "이런 모양의 문자열"을 기호로 표현한 패턴입니다. 이메일·전화번호 형식 검사, 로그에서 특정 줄 뽑기, 대량 찾아 바꾸기 등에 씁니다. 이 테스터는 브라우저의 RegExp를 그대로 쓰므로 JavaScript(ECMAScript) 문법 기준이며, Python이나 Java와는 일부 문법이 다를 수 있습니다.

플래그 정리

플래그이름효과
gglobal모든 일치를 찾음 (끄면 첫 번째만)
iignore case대소문자 무시
mmultiline^ $가 각 줄의 시작·끝에 일치
sdotAll.이 줄바꿈까지 포함
uunicode이모지 등 서로게이트 쌍을 한 글자로, \p{…} 사용

자주 쓰는 패턴 예시

예를 들어 test string에 주문 2025-10-05, 배송 2025-10-07을 넣고 패턴 (\d{4})-(\d{2})-(\d{2}), 플래그 g, 치환 $3/$2/$1을 쓰면 매칭 2개(@3, @18)가 잡히고 replace 결과는 주문 05/10/2025, 배송 07/10/2025이 돼요. 첫 매칭의 그룹은 $1=2025, $2=10, $3=05예요.

치환 문자열에서는 $1(번호 그룹), $<name>(이름 그룹), $&(일치 전체)를 쓸 수 있습니다.

패턴 옆 copy 버튼은 /패턴/플래그 형태의 리터럴을 복사하므로 JavaScript 코드에 바로 붙여넣을 수 있고, replace 패널의 copy는 치환이 끝난 전체 텍스트를 복사합니다. 문법이 틀리면 패턴 아래에 브라우저의 오류 메시지가 빨간색으로 표시됩니다.

표에는 최대 200개 매칭까지, 개수는 5,000개까지 셉니다. 빈 문자열에 일치하는 패턴(예: a*)은 개수에는 잡히지만 하이라이트되지 않습니다. 중첩 반복((a+)+ 같은 형태)은 긴 텍스트에서 브라우저를 멈추게 할 수 있으니 주의하세요.

예시 계산 3가지

목적패턴 · 플래그테스트 문자열결과
① 이메일 뽑기 (sample 버튼)(?<user>[\w.-]+)@(?<domain>[\w-]+\.[\w.]+) · g4줄 (smith@lab.dev, noreply@github.com, hello@world, dev.team@smith-94.io)3개 매칭 (@4, @25, @67). 점이 없는 hello@world는 제외. 치환 $<user> [at] $<domain> → smith [at] lab.dev
② 탐욕 vs 게으른 수량자<.*> 와 <.*?> · g<b>굵게</b>와 <i>기울임</i>탐욕은 전체 1개, 게으른 쪽은 <b> </b> <i> </i> 4개
③ 줄마다 휴대폰 번호 검사^01[016789]-?\d{3,4}-?\d{4}$ · gm010-1234-5678 / 01098765432 / 02-123-4567 / 010-12-3456앞의 2줄만 매칭. m을 끄면 0개 — ^ $가 전체 문자열 처음·끝만 보기 때문

③처럼 여러 줄 목록을 한 번에 검사할 때는 m 플래그가 꼭 필요해요. 반대로 입력칸 하나를 검사하는 폼 검증에서는 m을 빼야 "정상 번호⏎아무 글자"처럼 줄을 바꿔 끼운 값이 통과하지 않아요.

광고

문법 빠른 표

분류문법뜻예
문자 클래스\d \w \s숫자 0~9 · 영문·숫자·밑줄 · 공백류JS의 \d는 아라비아 숫자만 (아랍 숫자 ١٢٣은 제외)
수량자* + ? {n,m}0개 이상 · 1개 이상 · 0~1개 · n~m개\d{3,4} = 숫자 3~4개
게으른 수량자*? +?가능한 한 짧게예시 ② 참고
그룹( ) (?: ) (?<이름> )캡처 · 캡처 안 함 · 이름 붙은 캡처치환에서 $1, $<이름>
앞뒤 조건(?=) (?!) (?<=) (?<!)뒤에 오는 것 · 안 오는 것 · 앞에 있는 것 · 없는 것(?<=₩)[\d,]+ → ₩12,000에서 12,000만
경계^ $ \b시작 · 끝 · 단어 경계\b는 한글 사이에서는 기대대로 동작하지 않아요 (한글이 \w가 아니라서)

전체 문법은 MDN 정규 표현식 안내서가 이 테스터와 같은 JavaScript 기준이라 가장 정확해요. 기초부터 차근차근 보려면 정규식 기초 치트시트를, 성능 문제는 탐욕·게으른 수량자와 ReDoS를 참고하세요.

언어별로 다른 점

항목JavaScript (이 테스터)Python reJava
이름 그룹(?<name>…)(?P<name>…) ((?<name>…)로 쓰면 오류)(?<name>…)
인라인 플래그 (?i)안 됨 (플래그로 지정)됨됨
\d 범위0~9만유니코드 숫자 전체 (١٢٣도 매칭)0~9 (기본)
소유 수량자 a++없음3.11부터 지원지원
치환 그룹 참조$1\1 또는 \g<1>$1

파이썬으로 같은 문자열 가격 ١٢٣ 와 123에 \d+를 쓰면 두 개(١٢٣, 123)가 잡히지만, 여기서는 123 하나만 잡혀요. 다른 언어로 옮길 때 이런 차이로 결과가 달라질 수 있어요.

흔한 실수

광고
광고

자주 묻는 질문

정규식은 맞는 것 같은데 하나만 매칭돼요
g 플래그가 꺼져 있으면 첫 번째 일치에서 멈춥니다. 플래그 영역에서 g를 체크하세요. 여러 줄에서 ^, $를 쓴다면 m도 필요합니다.
Python 정규식도 여기서 테스트할 수 있나요?
기본 문법(문자 클래스, 수량자, 그룹, lookaround)은 거의 같아서 대부분 그대로 통합니다. 다만 이름 그룹은 Python이 (?P<name>…), JavaScript가 (?<name>…)로 다르고, 인라인 플래그 (?i)는 JavaScript에서 쓸 수 없습니다.
.* 가 너무 많이 잡혀요
*, +는 기본적으로 탐욕적(greedy)이라 가능한 한 길게 잡습니다. 뒤에 ?를 붙인 .*?(lazy)를 쓰면 가장 짧은 일치를 찾습니다.
점(.)이나 괄호 자체를 찾고 싶어요
특수문자는 앞에 백슬래시를 붙여 이스케이프합니다. 예: \., \(, \$. 대괄호 안에서는 [.]처럼 대부분 그대로 써도 됩니다.
휴대폰 번호 정규식은 어떻게 쓰나요?
한 칸짜리 입력 검증이면 ^01[016789]-?\d{3,4}-?\d{4}$를 플래그 없이 쓰세요. 010-1234-5678과 01098765432가 통과하고 02-123-4567, 010-12-3456은 걸러져요. 여러 줄 목록을 한 번에 검사할 때만 g와 m 플래그를 켜요.
여기서 되는 패턴이 Python에서는 결과가 달라요.
JavaScript와 Python은 문법이 비슷하지만 차이가 있어요. Python의 \d는 아랍 숫자 같은 유니코드 숫자까지 잡고, 이름 그룹은 (?P<name>…)로 써야 하며, 치환에서는 $1 대신 \1을 써요. 인라인 플래그 (?i)는 Python에서만 돼요.

관련 도구

이 도구와 함께 보면 좋은 글

광고

더 둘러보기

💻 개발자 다른 도구

🔥 많이 찾는 도구

🔮 재미로 한 번 더

📝 읽어 볼 만한 글

글 전체 보기 →