개발자

🔍 정규식 테스트기

JavaScript 정규식 실시간 매칭·하이라이트 + 캡처·치환·분할 + 한국 데이터 패턴 30+.

⚠️ 본 도구의 정규식 매칭은 모두 브라우저에서 실행되며 입력 데이터는 외부로 전송되지 않습니다. 주민번호·카드번호 등 개인정보를 다룰 때는 본 도구가 아닌 KISA·OWASP 가이드를 따른 안전한 검증 절차를 사용하세요. 잘못된 정규식은 브라우저를 일시 정지시킬 수 있습니다 (catastrophic backtracking) — 입력 100KB · 매치 1만 개 · 실행 시간 자동 제한. 분야별 안전 안내는 면책조항 참고.

🔣 정규식 패턴
//g
🚩 flags (g)
📝 테스트 문자열 (108 / 102,400 bytes)
📊 통계

0개 매치 · 실행 0.00ms

✨ 하이라이트 미리보기
Hello World — 안녕하세요 정규식 테스트입니다. Line 2 with numbers 123 and email@example.com.

💡 색상 5종 로테이션 · 매치 위치 강조. zero-width 매치(예: \b)는 보이지 않을 수 있어요.

정규식은 유효하지만 매치가 0개입니다. 패턴이 테스트 문자열과 일치하는지 확인해 보세요.

🛠️ 어떻게 사용하나요?

  1. 탭 1 매칭 — 정규식 + flags + 테스트 문자열 → 하이라이트 + 매치 카드(인덱스·길이·캡처 그룹·이름 그룹) 자동 표시
  2. 탭 2 치환·분할 — 같은 정규식·flags로 치환($1·$&·$<name>) 또는 split 결과 + JS/Python/Java/PHP 코드 스니펫 자동 생성
  3. 탭 3 패턴 라이브러리 — 한국 휴대폰·주민번호·사업자번호·우편번호 + 이메일·URL·UUID·HTML·마크다운 등 30+ 카드. 클릭 시 자동 적용
  4. 탭 4 치트시트 — 메타문자·양화한정자·문자클래스·그룹·앵커·룩어라운드·flags 6종 + JS regex 한계 + 흔한 실수

💡 정규식·flags·테스트 문자열·치환 패턴은 자동 저장됩니다. 200ms 디바운스로 입력 변화 시 즉시 재계산.

📘 정규식 기본 — 메타문자·양화한정자

정규식은 패턴(메타문자) + 반복(양화한정자)의 조합입니다. 가장 자주 쓰는 것부터 익히세요.

구문의미예시
.줄바꿈 외 모든 글자.+ → "abc"
\d숫자 [0-9]\d{3} → "123"
\w단어 문자\w+@ → "user@"
\s공백\s+ → " "
^ $시작·끝 앵커^abc$ → "abc" 전체 매치
*0회 이상 (greedy)a* → "", "a", "aaa"
+1회 이상\d+ → "1", "12", "123"
?0/1회colou?r → "color", "colour"
{n,m}n~m회\d{2,4} → 2~4자리 숫자
*?0회+ (lazy)<.*?> → 짧은 매치

💡 greedy vs lazy.*는 가능한 많이 매치(욕심), .*?는 가능한 적게 매치(게으름). HTML/JSON 추출에 lazy가 안전합니다.

🪪 캡처 그룹 — 인덱스 vs 이름 그룹

그룹은 괄호 ()로 감싸 만듭니다. 매치된 부분을 따로 추출하거나 치환에 참조할 수 있어요.

1. 인덱스 캡처 그룹 (...)

번호로 참조 ($1, $2, ...). 위치 순서대로 자동 번호.

패턴: (\w+)@(\w+\.\w+)
매치: "hello@example.com"
$1 = "hello"
$2 = "example.com"
치환 패턴 "$2/$1" → "example.com/hello"

2. 이름 캡처 그룹 (?<name>...)

이름으로 참조 ($<user>). 가독성 ↑, ES2018+ 표준.

패턴: (?<user>\w+)@(?<domain>\w+\.\w+)
매치: "hello@example.com"
groups.user   = "hello"
groups.domain = "example.com"

3. 비캡처 그룹 (?:...)

그룹화만 하고 캡처는 하지 않음. 성능 ↑·번호 절약.

패턴: (?:https?|ftp):\/\/(\w+)
매치: "https://example.com"
$1 = "example" (도메인만 캡처)
프로토콜은 그룹화만 됨

🚩 flags 6종 상세

flag이름설명예시
g전역(Global)모든 매치 찾기 (한 번이 아닌 모든 위치)matchAll·전체 치환
i대소문자 무시A=a 동일 취급/Hello/i → "hello", "HELLO"
m다중행(Multiline)^과 $가 각 줄 시작·끝에도 매치/^#/gm → 마크다운 헤더
sdotAll. 메타문자가 줄바꿈도 매치/<.*>/s → 여러 줄 HTML
uUnicode한글·이모지·\p{...} 유니코드 속성 매칭/\p{Emoji}/u → 😀
yStickylastIndex 위치에서만 매치 시도토큰화·파싱

⚡ Catastrophic Backtracking 주의

잘못된 정규식은 지수적 시간 복잡도로 브라우저·서버를 멈출 수 있습니다. 본 도구는 입력 100KB · 매치 1만 개 · 실행 시간 측정 3중 안전망을 제공합니다.

🚨 위험 패턴 사례

  • (a+)+$ + aaaaaaaaaaaaa! — 매치 시도 2^N
  • (a|aa)+$ — 분기 백트래킹 폭발
  • (.*)* — 무한 분기
  • (\w+\s?)+$ — 긴 입력 시 멈춤

✅ 안전한 대체 패턴

  • 중첩 양화 한정자 피하기 — (a+)+a+
  • 분기는 가능한 한 명확하게 — (?:foo|bar)
  • 가능하면 lazy 사용 — .*?
  • 구체적인 character class — [^"]+ like
  • 입력 길이 제한 (서버에서도 100KB·1MB 권장)

자주 묻는 질문 (FAQ)

Q1. JavaScript 정규식과 PCRE/Python의 차이는?

본 도구는 JavaScript regex 엔진(브라우저 네이티브)을 사용합니다. 다른 엔진과 차이:
가변폭 lookbehind: JS는 가변폭 지원 (모던 브라우저), PCRE는 고정폭만
Atomic group (?>...): PCRE 전용, JS 미지원
재귀 패턴 (?R): PCRE 전용
Verbose flag re.X: Python 전용 (한 줄에 모두 작성)
Possessive quantifier a*+: PCRE 전용
유니코드 속성 \p{...}: JS는 u flag 필수, PCRE는 항상 가능

Q2. greedy(.*)와 lazy(.*?)의 차이는?

greedy(.*)는 가능한 한 많이 매치하려 합니다(기본값). lazy(.*?)는 가능한 한 적게 매치합니다.
예시 — 입력 <b>hello</b><i>world</i>:
<.*> (greedy) → 전체 매치 = <b>hello</b><i>world</i>
<.*?> (lazy) → 4번 매치 = <b>, </b>, <i>, </i>
HTML 태그·JSON 키 추출 등 중첩 가능한 데이터는 lazy가 안전합니다.

Q3. 캡처 그룹과 비캡처 그룹의 차이?

캡처 그룹 (...)는 매치한 부분을 저장해 $1·$2로 참조 가능.
비캡처 그룹 (?:...)는 그룹화만 하고 저장 안 함.
비캡처 그룹을 쓰는 이유:
성능 ↑ — 메모리·시간 절약
그룹 번호 절약$1·$2 등이 진짜 필요한 그룹만 차지
예: (?:https?|ftp):\/\/(\w+) — 프로토콜은 그룹화만, 도메인만 $1로 캡처

Q4. 이름 캡처 그룹 (?<name>...)이란?
ES2018부터 추가된 기능으로, 그룹에 이름을 붙여 가독성을 높입니다.
예시:
패턴: (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
매치: "2026-05-15"
match.groups.year   = "2026"
match.groups.month  = "05"
match.groups.day    = "15"
치환: "$<year>년 $<month>월 $<day>일"
$1·$2·$3처럼 번호로 셀 필요 없이 의미 있는 이름으로 접근 — 코드 가독성 ↑.
Q5. lookahead와 lookbehind는?

매치 위치를 검사만 하고 소비(consume)하지 않는 zero-width 어서션입니다.
Lookahead 양수 (?=...) — 뒤가 ...일 때 매치
Lookahead 음수 (?!...) — 뒤가 ...아닐 때 매치
Lookbehind 양수 (?<=...) — 앞이 ...일 때 매치
Lookbehind 음수 (?<!...) — 앞이 ...아닐 때 매치
예시 — 가격 추출(원 앞 숫자만):
\d+(?=원) + 입력 1000원, 2000$1000만 매치 (2000은 뒤가 $이라 제외).
비밀번호 검증의 (?=.*\d)(?=.*[A-Z])도 lookahead 활용.

Q6. flags g와 y의 차이는?

g (Global)matchAll·replace모든 매치 찾기. 어디서든 매치 가능.
y (Sticky)regex.lastIndex 위치에서 정확히 매치 시도. 그 위치에서 매치 안 되면 실패.
차이 예: 입력 foo bar, lastIndex=4
/bar/g → 4번 인덱스부터 검색 → 매치 (4-7)
/bar/y → 4번 인덱스에서 정확히 매치 → 매치 (4-7)
하지만 lastIndex=3이면:
/bar/g → 3번부터 검색 → 매치 (4-7)
/bar/y → 3번에 "bar"가 없음 → 실패
y flag는 토큰화·파서 작성 시 유용 (현재 위치만 검사).

Q7. flags u 플래그가 왜 필요한가요?

유니코드 인식 모드를 켭니다. 한글·이모지·기타 BMP 외 문자를 정확히 매치해요.
u flag 없을 때 문제:
• 이모지(서로게이트 페어) → 한 글자가 두 코드 단위로 분리됨
\p{...} 유니코드 속성 매칭 → 오류
u flag 사용 시 가능:
\p{Emoji} — 이모지
\p{L} — 모든 문자 (Letter)
\p{N} — 숫자 (Number)
\p{Script=Hangul} — 한글 스크립트
한글·이모지 정확 매칭이 필요하면 u flag 거의 필수입니다.

Q8. 한글·이모지 매칭은 어떻게 하나요?

한글 매칭:
완성형 한글: [가-힣] — 가장 일반적
자모 분리: [ㄱ-ㅎㅏ-ㅣ] — 초성·중성
유니코드 속성: \p{Script=Hangul} (u flag 필수) — 옛한글 포함
이모지 매칭:
기본: \p{Emoji} (u flag 필수)
피부톤·복합 이모지: \p{Emoji_Presentation} 또는 \p{Extended_Pictographic}
주의: 가족 이모지 같은 ZWJ 시퀀스는 정규식만으론 정확히 한 단위로 매치 어려움
본 도구의 [📚 패턴 라이브러리]에서 한글·자모·한자·이모지 패턴을 클릭으로 적용 가능합니다.

Q9. 주민번호·카드번호 검증 정규식 안전한가요?

형식만 검증할 뿐 실제 유효성은 보장하지 않습니다.
주민번호 — 형식 검증 외 체크섬(7자리 검증 알고리즘) + 출생연도·성별 코드 일관성 검증 필수
카드번호Luhn 알고리즘으로 체크섬 검증 + 카드사 BIN 확인 필요
사업자등록번호 — 자체 체크섬 (마지막 자리 검증)
개인정보 처리 시 주의:
• 「개인정보 보호법」상 주민번호·카드번호는 고유식별정보 — 수집·저장·전송 시 암호화 의무
• 실 운영에서는 토큰화·마스킹 권장 (직접 저장 금지)
• 본 도구의 패턴은 형식 검증 어림이며, 실제 검증·저장은 KISA·OWASP 가이드 + 검증 알고리즘(체크섬) + 안전한 암호화 절차가 추가로 필요합니다. 면책조항 참조.

Q10. 정규식이 너무 느려요 (catastrophic backtracking)

중첩된 양화 한정자가 있으면 입력 길이에 지수적으로 시간이 늘어납니다.
위험 패턴:
(a+)+$a N개 + ! 입력 시 2^N 시도
(a|aa)+ — 분기 백트래킹 폭발
(.*)* — 무한 분기
해결 방법:
1. 중첩 양화 한정자 제거(a+)+a+
2. 분기 명확화a|aa 대신 a{1,2}
3. 구체적 character class.+ 대신 [^"]+
4. lazy 양화 한정자.*?
본 도구는 100ms 초과 시 ⚠️ 경고를 표시하며, 입력 100KB · 매치 1만 개로 자동 제한합니다.

함께 쓰면 좋은 도구

🔒

해시 생성기

MD5·SHA·HMAC·파일 무결성

🔐

Base64 인코더/디코더

텍스트·파일 ↔ Base64

📋

JSON 포맷터

JSON 정렬·압축·유효성 검사