정규식 테스터
정규표현식을 입력하면 일치하는 부분을 즉시 하이라이트하고, 캡처 그룹과 치환 결과까지 함께 확인합니다.
일치 결과 1건
패턴과 텍스트는 브라우저 안에서만 처리되며 서버로 전송되지 않습니다.
플래그부터 확인하세요
정규식이 예상대로 동작하지 않을 때 원인의 절반은 플래그입니다.
| 플래그 | 뜻 | 없으면 |
|---|---|---|
| g | 전체 찾기 | 첫 번째 일치만 찾습니다 |
| i | 대소문자 무시 | 대소문자를 구분합니다 |
| m | 여러 줄 모드 | ^와 $가 문자열 전체의 시작·끝만 가리킵니다 |
| s | dotAll | .이 줄바꿈에 일치하지 않습니다 |
| u | 유니코드 | 이모지 같은 확장 문자를 한 글자로 다루지 못합니다 |
특히 m 플래그가 헷갈립니다. 여러 줄 텍스트에서 각 줄의 시작을 잡고 싶다면 m을 켜야 ^가 줄 단위로 동작합니다.
이스케이프해야 하는 문자
정규식에서 특별한 뜻을 갖는 문자를 그대로 찾으려면 앞에 역슬래시를 붙여야 합니다.
.*+?^${}()|[]\
가장 흔한 실수는 마침표입니다. example.com을 찾으려고 그대로 쓰면 .이 아무 문자 하나에 일치해 exampleXcom도 걸립니다. example\.com이라고 써야 정확합니다.
대괄호 안에서는 규칙이 조금 다릅니다. [.]처럼 문자 클래스 안에 넣으면 마침표가 그대로 취급되어 이스케이프가 필요 없습니다.
자주 쓰는 패턴
숫자만: ^\d+$
한글만: ^[가-힣]+$
이메일(간이): [\w.+-]+@[\w-]+\.[\w.]+
전화번호: 0\d{1,2}-\d{3,4}-\d{4}
날짜(YYYY-MM-DD): \d{4}-\d{2}-\d{2}
HTML 태그: <[^>]+>
이메일 패턴은 완벽할 수 없다는 점을 알아두시는 게 좋습니다. RFC 5322를 온전히 구현한 정규식은 수천 자에 달하고 실무에서 쓸 수 없습니다. 형식 검증은 느슨하게 하고 실제 확인은 인증 메일 발송으로 하는 것이 표준적인 접근입니다.
탐욕적 매칭과 게으른 매칭
*와 +는 기본적으로 탐욕적입니다. 가능한 한 길게 잡습니다.
<div>내용</div>에서 <.*>를 쓰면 전체가 통째로 잡힙니다. <로 시작해 마지막 >까지 먹기 때문입니다.
?를 붙이면 게으른 매칭이 되어 최소한만 잡습니다. <.*?>는 <div>와 </div>를 각각 잡습니다.
같은 결과를 부정 문자 클래스로도 얻을 수 있습니다. <[^>]*>는 >가 아닌 문자만 먹으므로 백트래킹 없이 더 빠릅니다.
캡처 그룹과 치환
괄호로 묶은 부분은 캡처 그룹이 되어 나중에 참조할 수 있습니다.
날짜 형식을 바꾸는 예를 봅시다.
- 패턴:
(\d{4})-(\d{2})-(\d{2}) - 치환:
$3/$2/$1 - 결과:
2026-08-27→27/08/2026
이름 있는 그룹을 쓰면 훨씬 읽기 좋습니다.
- 패턴:
(?<year>\d{4})-(?<month>\d{2}) - 치환:
$<year>년 $<month>월
캡처가 필요 없는데 그룹으로 묶어야 한다면 (?:...)를 쓰세요. 불필요한 캡처를 만들지 않아 조금 더 빠릅니다.
브라우저가 멈추는 정규식
(a+)+$ 같은 패턴에 aaaaaaaaaaaaaaaaaaaaX를 넣으면 사실상 무한히 계산합니다. 반복 안에 반복이 들어가 경우의 수가 지수적으로 폭발하기 때문입니다. 이를 재앙적 백트래킹이라고 합니다.
서버에서 사용자 입력에 정규식을 적용한다면 이것이 서비스 거부 공격 통로가 됩니다. 실제로 여러 대형 서비스가 이 문제로 장애를 겪었습니다.
피하는 방법은 단순합니다.
- 중첩된 수량자를 쓰지 않습니다
.*대신[^특정문자]*처럼 범위를 좁힙니다- 정규식으로 파싱할 문제인지 다시 생각합니다 (HTML과 JSON은 전용 파서를 쓰세요)