본문으로 건너뛰기
소이툴즈

정규식 테스터

정규표현식을 입력하면 일치하는 부분을 즉시 하이라이트하고, 캡처 그룹과 치환 결과까지 함께 확인합니다.

//g
플래그

일치 결과 1건

주문번호: A-2026-0827 담당자: 홍길동 (hong@example.com) 연락처: 010-1234-5678 금액: 1,250,000원

패턴과 텍스트는 브라우저 안에서만 처리되며 서버로 전송되지 않습니다.

플래그부터 확인하세요

정규식이 예상대로 동작하지 않을 때 원인의 절반은 플래그입니다.

| 플래그 | 뜻 | 없으면 | |---|---|---| | g | 전체 찾기 | 첫 번째 일치만 찾습니다 | | i | 대소문자 무시 | 대소문자를 구분합니다 | | m | 여러 줄 모드 | ^와 $가 문자열 전체의 시작·끝만 가리킵니다 | | s | dotAll | .이 줄바꿈에 일치하지 않습니다 | | u | 유니코드 | 이모지 같은 확장 문자를 한 글자로 다루지 못합니다 |

특히 m 플래그가 헷갈립니다. 여러 줄 텍스트에서 각 줄의 시작을 잡고 싶다면 m을 켜야 ^가 줄 단위로 동작합니다.

도구 읽는 법

패턴과 플래그를 넣으면 아래 텍스트에서 일치하는 부분이 강조되고, 일치 목록에 각 매치의 위치와 캡처 그룹 값이 나옵니다. 이름 있는 그룹은 이름과 함께 표시됩니다. 치환 칸에 문자열을 넣으면 $1, $<name> 참조가 적용된 결과가 함께 보이므로, 에디터의 찾아 바꾸기에 넣기 전에 여기서 확인하면 됩니다. 치환은 g 플래그가 없어도 전체에 적용됩니다.

패턴이 문법에 맞지 않으면 브라우저가 내는 오류 메시지가 그대로 표시됩니다. 닫히지 않은 괄호, 대괄호 안의 잘못된 범위([z-a]), 아무것도 없는 수량자(*abc)가 흔한 원인입니다.

자주 쓰는 문자 클래스와 수량자

| 표기 | 뜻 | 표기 | 뜻 | | --------- | ---------------------------- | ------- | --------------------- | | \d | 숫자 0~9 | * | 0번 이상 | | \w | 영문·숫자·밑줄 | + | 1번 이상 | | \s | 공백·탭·줄바꿈 | ? | 0번 또는 1번 | | [가-힣] | 완성형 한글 음절 | {3} | 정확히 3번 | | [ㄱ-ㅎㅏ-ㅣ] | 자음·모음 (ㅋㅋ, ㅠㅠ) | {2,4} | 2~4번 | | . | 줄바꿈 제외 아무 문자 | {2,} | 2번 이상 |

대문자로 쓰면 반대입니다. \D는 숫자가 아닌 문자, \S는 공백이 아닌 문자입니다.

한글에서 \b와 \w는 통하지 않습니다

자바스크립트 정규식에서 \w는 영문·숫자·밑줄만 뜻합니다. 한글은 포함되지 않고, u 플래그를 켜도 마찬가지입니다. 그래서 단어 경계 \b도 한글에는 쓸 수 없습니다. \b한글\b는 "안녕 한글 입니다"에서조차 일치하지 않는데, 공백과 한글 둘 다 단어 문자가 아니라 그 사이에 경계가 생기지 않기 때문입니다.

한글 단어의 앞뒤를 제한하려면 전후방 탐색으로 직접 조건을 씁니다.

  • 패턴: (?<![가-힣])한글(?![가-힣])
  • "안녕 한글 입니다" → 일치, "한글입니다" → 불일치

한글 문자를 폭넓게 잡으려면 [가-힣]에 자모 [ㄱ-ㅎㅏ-ㅣ]를 더하면 됩니다. 이모지처럼 두 코드 단위로 이루어진 문자는 u 플래그가 있어야 . 하나에 일치합니다.

이스케이프해야 하는 문자

정규식에서 특별한 뜻을 갖는 문자를 그대로 찾으려면 앞에 역슬래시를 붙여야 합니다.

. * + ? ^ $ { } ( ) | [ ] \

가장 흔한 실수는 마침표입니다. 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를 온전히 구현한 정규식은 수천 자에 달하고 실무에서 쓸 수 없습니다. 형식 검증은 느슨하게 하고 실제 확인은 인증 메일 발송으로 하는 것이 표준적인 접근입니다.

전후방 탐색으로 조건만 걸기

(?=...)와 (?<=...)는 그 자리에 무엇이 있어야 하는지만 확인하고 결과에는 포함하지 않습니다. "가격: 12,000원"에서 숫자만 뽑을 때 (?<=가격: )[\d,]+라고 쓰면 12,000만 잡힙니다.

비밀번호 규칙 검사에도 씁니다. 영문·숫자·특수문자를 각각 하나 이상 포함한 8자 이상은 다음과 같이 씁니다.

^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z\d]).{8,}$

앞의 세 괄호가 각 조건을 확인하고 마지막 .{8,}가 길이를 봅니다. 조건을 하나 더 추가하고 싶으면 괄호 하나를 더 붙이면 되므로 규칙이 바뀌어도 고치기 쉽습니다.

로그와 데이터 정리에 쓰는 패턴

  • IP 주소: \d{1,3}(?:\.\d{1,3}){3} — 로그 한 줄에서 IP만 뽑습니다
  • 시각: \d{2}:\d{2}:\d{2} — 시:분:초
  • 금액의 쉼표 제거: 패턴 , 치환 빈칸 — 엑셀에서 복사한 숫자를 계산 가능하게 만듭니다
  • 여러 공백을 하나로: 패턴 \s+ 치환 한 칸
  • 줄 앞뒤 공백 제거: 패턴 ^\s+|\s+$ 플래그 gm, 치환 빈칸
  • 주민등록번호 뒷자리 가리기: 패턴 (\d{6})-\d{7} 치환 $1-*******

탐욕적 매칭과 게으른 매칭

*와 +는 기본적으로 탐욕적입니다. 가능한 한 길게 잡습니다.

<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>월

캡처가 필요 없는데 그룹으로 묶어야 한다면 (?:...)를 쓰세요. 불필요한 캡처를 만들지 않아 조금 더 빠릅니다.

다른 언어로 가져갈 때

이 도구는 자바스크립트 정규식 엔진으로 동작합니다. 대부분의 패턴은 파이썬·자바·Go에서 그대로 쓸 수 있지만 몇 가지가 다릅니다. 파이썬의 이름 있는 그룹은 (?P<name>...)이고 치환 참조는 \1 또는 \g<name>입니다. Go의 표준 엔진은 전후방 탐색을 지원하지 않습니다. 자바에서 문자열 안에 쓸 때는 역슬래시를 \\d처럼 두 번 적어야 합니다. 여기서 확인한 패턴이 다른 곳에서 안 된다면 이런 차이부터 살펴보세요.

브라우저가 멈추는 정규식

(a+)+$ 같은 패턴에 aaaaaaaaaaaaaaaaaaaaX를 넣으면 사실상 무한히 계산합니다. 반복 안에 반복이 들어가 경우의 수가 지수적으로 폭발하기 때문입니다. 이를 재앙적 백트래킹이라고 합니다.

서버에서 사용자 입력에 정규식을 적용한다면 이것이 서비스 거부 공격 통로가 됩니다. 실제로 여러 대형 서비스가 이 문제로 장애를 겪었습니다.

피하는 방법은 단순합니다.

  • 중첩된 수량자를 쓰지 않습니다
  • .* 대신 [^특정문자]*처럼 범위를 좁힙니다
  • 정규식으로 파싱할 문제인지 다시 생각합니다 (HTML과 JSON은 전용 파서를 쓰세요)

함께 확인하면 좋은 것

문자열 인코딩이 필요하다면 URL 인코더를, 두 텍스트의 차이를 보려면 텍스트 비교를 이용하세요.

자주 묻는 질문

최종 수정 2026년 9월 6일