logo
GeekFormat

정규식 테스터

Regex Tester
//
无匹配
Worker · 500ms 超时中断
分类模板库
点选即可填充 pattern / flags / demo
测试文本37
匹配详情
0

还没有匹配结果

输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。

匹配高亮预览· Hover / 点击右侧条目联动
Ada Lovelace Alan Turing Grace Hopper

统计

匹配数量
0
执行耗时
0ms
捕获组
0
命名分组
0

命名分组汇总

当前没有命名分组。

무료 온라인 정규식 테스터(Regex Tester). JS 실시간 매칭 테스트, Capture Group/Named Group 확인, 치환 미리보기, 정규식 구문 설명 지원. Web Worker ReDoS 타임아웃 보호 내장, 자주 쓰는 정규식 템플릿 라이브러리 포함. 개발자가 정규식을 빠르게 디버깅하고 검증하는 데 최적입니다.

관련 추천

사용 사례

  • 폼 검증 규칙 개발 시 이메일, 전화번호, 주민등록번호, URL 등 정규식이 올바른지 온라인으로 테스트
  • 로그 분석 시 정규식으로 ERROR/INFO 레벨 로그에서 타임스탬프, 오류 메시지, IP 주소 추출
  • 데이터 클렌징/ETL 시 날짜 형식 변환, 민감 정보 마스킹(전화번호 중간 자리 별표 처리) 등 정규식 치환 효과 미리보기
  • 웹 스크래핑 시 콘텐츠 추출용 정규식이 대상 HTML 프래그먼트나 JSON 필드에 정확히 매치하는지 검증
  • 정규식 학습 시 '설명' 패널에서 각 메타문자와 Quantifier의 의미를 이해하고 템플릿으로 빠르게 익히기
  • Code Review 시 의심되는 정규식을 공유 링크로 동료에게 보내 함께 디버깅·최적화

주요 기능

  • Web Worker 샌드박스 실행: 정규식은 독립된 Worker 스레드에서 실행되며 500ms 타임아웃으로 자동 중단되어 ReDoS로 인한 브라우저 프리징 완전 방지
  • 실시간 매치+컬러 하이라이트: 입력 즉시 매치 결과가 표시되며 매치마다 5가지 색상으로 하이라이트, 호버 시 상세 패널 연동
  • Capture Group+Named Group: 각 매치를 자동으로 펼쳐 모든 Capture Group($1/$2)과 Named Group($<name>)을 표시하고 집계 통계도 제공
  • 치환 미리보기: 치환 문자열을 입력하면 실시간으로 치환 결과를 미리보기, $1/$&/$`/$'/$<name> 구문 퀵 버튼 지원
  • 정규식 구문 설명: 정규식을 자동으로 분석하여 메타문자, Quantifier, Group, 앵커 등 구문 의미를 요소별로 설명
  • 12개 자주 쓰는 템플릿: 이메일/URL/전화번호/중국어/IPv4/UUID/날짜/로그/HTML 태그 등 12개 고빈도 정규식 템플릿 내장, 원클릭 입력
  • 6개 Flags 토글: g/i/m/s/u/y Flags 시각적 토글 버튼, 구문을 암기할 필요 없음
  • 공유 링크: pattern/flags/text를 포함하는 URL 원클릭 생성, 동료에게 복사하여 테스트 현장 그대로 재현
  • 실행 통계: 매치 수, 실행 시간(ms), Capture Group 총 개수, Named Group 수 실시간 표시
  • 1500개 매치 상한: 초장문 텍스트로 인한 페이지 렉 방지를 위해 자동 절단, 잘못된 정규식에 친절한 구문 오류 힌트 표시

이용 방법

  1. 상단 / / 사이 입력창에 정규식 패턴을 입력하고(슬래시를 직접 추가할 필요 없음), 오른쪽에 Flags(g, gi, gim 등)를 입력하거나 아래 버튼을 클릭하여 토글
  2. '테스트 텍스트' 영역에 매치시킬 텍스트를 붙여넣거나 입력하면 매치 결과가 실시간으로 컬러 하이라이트 표시
  3. 오른쪽 '매치 상세' 패널을 클릭하면 각 매치의 위치, 내용, Capture Group, Named Group을 확인
  4. '치환 영역' 탭으로 전환하여 치환 문자열을 입력하면($1/$&/$<name> 등 참조 지원), 실시간으로 치환 결과 미리보기
  5. '패턴 설명' 탭으로 전환하면 자동 생성된 정규식 구문 요소별 설명 확인
  6. 자주 쓰는 템플릿이 필요하면 왼쪽 '템플릿 라이브러리'를 클릭하여 해당 템플릿을 선택해 원클릭으로 입력; 디버깅 완료 후 '공유'를 클릭하여 링크 생성

자주 묻는 질문

ReDoS란 무엇인가요? 정규식 테스트에 ReDoS 방지가 필요한 이유는?

ReDoS(Regular Expression Denial of Service, 정규식 서비스 거부 공격)는 악의적으로 작성된 정규식 패턴(예: 긴 문자열에 `(a+)+$` 매칭)이 치명적인 백트래킹(catastrophic backtracking)을 유발하여 CPU 사용률 100%, 브라우저 프리징, 서버 크래시를 일으키는 현상입니다. 이 도구는 Web Worker 샌드박스에서 정규식 매칭을 실행하고 500ms 타임아웃으로 자동 중단하므로, 백트래킹을 유발하는 악성 정규식을 입력해도 브라우저가 멈추지 않습니다 — 이것이 이 도구의 핵심 보안 기능입니다.

g, i, m, s, u, y 여섯 개 Flags는 무슨 의미인가요?

g(global)는 첫 번째 매치가 아닌 모든 매치를 찾습니다; i(ignoreCase)는 대소문자를 구분하지 않습니다; m(multiline)은 ^와 $가 각 줄의 시작/끝에 매치되도록 합니다; s(dotAll)은 닷(.)이 개행 문자를 포함한 모든 문자에 매치되도록 합니다; u(unicode)는 Unicode 모드로 emoji와 멀티바이트 문자를 올바르게 처리합니다; y(sticky)는 lastIndex 위치에서 정확히 매치하는 스티키 매칭을 수행합니다. 이 도구는 여섯 개 Flags의 시각적 토글 버튼을 제공하여 클릭으로 실시간 on/off할 수 있습니다.

Capture Group과 Named Group이 무엇인가요? 어떻게 사용하나요?

Capture Group은 괄호 `(pattern)`로 감싸며, 매치 후 $1, $2 등으로 참조하여 부분 문자열을 추출할 수 있습니다. Named Group은 `(?<name>pattern)` 구문으로 정의하며, 매치 후 `$<name>`으로 참조할 수 있어 코드 가독성이 더 높습니다. 예를 들어 `(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})`로 날짜를 매치시킨 후, 치환 문자열에서 `$<year>년$<month>월$<day>일`처럼 재포맷할 수 있습니다. 이 도구는 각 매치의 Capture Group과 Named Group 결과를 자동으로 나열하여 보여줍니다.

어떤 프로그래밍 언어의 정규식 구문을 지원하나요?

이 도구는 JavaScript 네이티브 RegExp 엔진을 기반으로 하며, JS/TypeScript, Python re 모듈, Java java.util.regex, PHP preg_*, Go regexp 등 주류 엔진(모두 PCRE/Perl 계열)과 대체로 호환됩니다. 일부 고급 기능(Python의 `(?P<name>)` Named Group 구문, .NET의 가변 길이 lookbehind 등)에는 차이가 있습니다. 일상 개발에서 쓰는 99%의 정규식(이메일, 전화번호, URL, 날짜 검증/추출)은 모든 엔진에서 공통으로 사용되므로, 여기서 테스트한 후 코드에 복사하여 사용할 수 있습니다.

테스트한 정규식을 동료와 공유하려면 어떻게 하나요?

상단 툴바의 '공유' 버튼을 클릭하면 현재 정규식 패턴, Flags, 테스트 텍스트가 URL 매개변수에 인코딩되어 링크가 클립보드에 복사됩니다. 동료가 링크를 열면 완전히 동일한 테스트 상태(pattern+flags+testText)가 표시되므로 팀 협업과 원격 디버깅에 매우 적합합니다.

치환 문자열의 $1, $&, $`, $' 같은 특수 기호는 무슨 의미인가요?

치환 문자열에서: $1, $2...는 N번째 Capture Group을 나타냅니다; $&는 매치된 전체 텍스트를 나타냅니다; $`는 매치된 텍스트 앞부분을 나타냅니다; $'는 매치된 텍스트 뒷부분을 나타냅니다; $$는 리터럴 $를 나타냅니다; $<name>은 Named Group을 나타냅니다. 예를 들어 `(\d{4})-(\d{2})-(\d{2})`를 `$2/$3/$1`로 치환하면 2026-03-12가 03/12/2026로 변환됩니다. 이 도구의 치환 영역에는 이러한 특수 기호의 빠른 삽입 버튼이 마련되어 있습니다.

정규식(Regex/RegExp)이란 무엇인가요?

정규식(Regular Expression, 약칭 Regex/RegExp)은 단일 문자열로 특정 구문 규칙을 따르는 일련의 문자열을 기술·매치시키는 텍스트 패턴 언어입니다. 그 역사는 1950년대 신경과학자 Warren McCulloch와 수학자 Walter Pitts가 제안한 뉴런 수학 모델로 거슬러 올라가며, 이후 수학자 Stephen Kleene이 1956년 그 위에 '정규 집합'의 대수적 기술을 제안했습니다. Unix의 아버지 Ken Thompson은 1960년대 후반 QED 에디터에서 정규식을 최초로 구현했으며, 이후 정규식은 Unix 툴체인(grep, sed, awk, vi)의 핵심 기능이 되었습니다.

현대 프로그래밍 언어에서 정규식은 거의 기본 기능입니다——JavaScript의 RegExp, Python의 re 모듈, Java의 java.util.regex, .NET의 Regex 클래스, Go의 regexp 패키지 모두 정규식을 지원합니다. 정규식은 폼 검증(이메일/전화번호/ID), 텍스트 검색&치환(에디터 찾기/바꾸기), 로그 분석(ERROR 로그 추출), 웹 스크래핑(HTML 콘텐츠 추출), 데이터 클렌징(ETL), 라우트 매칭, 입력 필터링, 보안(WAF 규칙) 등의 분야에서 널리 사용됩니다.

정규식의 핵심 개념에는: 문자 클래스(\d 숫자, \w 단어 문자, \s 공백), Quantifier(* 0회 이상, + 1회 이상, ? 0회 또는 1회, {n,m} 지정 횟수), 앵커(^ 시작, $ 끝, \b 단어 경계), 그룹((...) Capture Group, (?:...) 비Capture Group, (?<name>...) Named Group), 분기(|), 문자셋([a-z]), Lookaround((?=...) 양성 전방 탐색, (?!) 음성 전방 탐색) 등이 있습니다. 정규식을 마스터하면 텍스트 처리 효율이 크게 향상되지만 ReDoS 같은 성능 함정에도 주의해야 합니다.

术语表

Regex / RegExp
Regular Expression(정규식)의 약자. 텍스트 검색, 치환, 검증에 사용되는 텍스트 매칭 패턴을 기술하는 문자열 구문.
Capture Group
괄호(pattern)로 감싼 부분식. 매치 결과는 $1, $2로 위치에 따라 참조할 수 있습니다.
Named Group
(?<name>pattern) 구문으로 정의된 Capture Group. $<name>으로 이름에 의해 참조할 수 있어 숫자 참조보다 가독성이 높습니다.
ReDoS
Regular Expression Denial of Service(정규식 서비스 거부). 치명적인 Backtracking으로 정규식 실행 시간이 지수적으로 증가하여 브라우저나 서버를 프리징시킵니다.
Backtracking
NFA 정규식 엔진이 매치 시도에 실패했을 때 이전 위치로 돌아가 다른 가능성을 시도하는 메커니즘. 복잡한 정규식에서는 지수적 백트래킹이 발생할 수 있습니다.
Flags
정규식 매칭 동작을 수정하는 매개변수. 일반적인 것: g(전역), i(대소문자 무시), m(다중행), s(dotAll), u(Unicode), y(스티키).
Lookaround
너비가 0인 어서션. 양성 전방 탐색(?=...), 음성 전방 탐색(?!...), 양성 후방 탐색(?<=...), 음성 후방 탐색(?<!...)이 있으며, 문자를 소비하지 않고 위치만 판단합니다.
PCRE
Perl Compatible Regular Expressions(Perl 호환 정규식). 널리 사용되는 정규식 구문 표준으로 PHP, Java, Python 등 대부분의 언어에서 채택하고 있습니다.
Web Worker
브라우저가 제공하는 메인 스레드와 독립된 백그라운드 스레드 API. 이 도구는 Worker 내에서 정규식을 실행하여 ReDoS가 발생해도 UI를 차단하지 않습니다.
Quantifier
앞 요소의 반복 횟수를 지정하는 구문: *(0회 이상), +(1회 이상), ?(0회 또는 1회), {n}(정확히 n회), {n,m}(n~m회).

정규식 자주 쓰는 메타문자 치트시트

메타문자의미예시
.임의의 단일 문자(개행 제외, s 플래그 시 개행 포함)a.c는 abc, aXc에 매치, a\nc에는 매치하지 않음
\d숫자 문자, [0-9]와 동일\d{3}은 123, 456에 매치
\w단어 문자, [A-Za-z0-9_]와 동일\w+는 hello_123에 매치
\s공백 문자(공백/탭/개행 등)a\sb는 a b(사이 공백)에 매치
^문자열 시작(m 플래그 시 행 시작)^Hello는 행 시작의 Hello에 매치
$문자열 끝(m 플래그 시 행 끝)end$는 행 끝의 end에 매치
\b단어 경계\bcat\b는 독립된 단어 cat에 매치, category에는 매치하지 않음
*앞 요소가 0회 이상 반복(욕심쟁이)ab*c는 ac, abc, abbc에 매치
+앞 요소가 1회 이상 반복ab+c는 abc, abbc에 매치, ac에는 매치하지 않음
?앞 요소가 0회 또는 1회(또는 게으른 수량자/Lookaround에 사용)colou?r는 color와 colour 모두에 매치
|분기/또는, 왼쪽 또는 오른쪽에 매치cat|dog는 cat 또는 dog에 매치
[...]문자셋, 안의 문자 중 하나에 매치[aeiou]는 임의의 모음에 매치

자주 쓰는 정규식 템플릿 치트시트

용도정규식권장 Flags
이메일 주소[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}g
중국 본토 휴대폰 번호1[3-9]\d{9}g
URL 링크https?:\/\/[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b[-a-zA-Z0-9()@:%_+.~#?&/=]*gi
IPv4 주소\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\bg
날짜 YYYY-MM-DD\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])g
중국 신분증 번호(18자리)[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx]g
UUID[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}gi

Code Examples

JavaScript에서 정규식 매치와 치환

// 이메일 형식 검증
const emailRe = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailRe.test('user@example.com')); // true

// Named Group 추출 (날짜 파싱)
const dateRe = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g;
const text = '회의 시간: 2026-03-12, 마감: 2026-04-01';
const matches = [...text.matchAll(dateRe)];
for (const m of matches) {
  console.log(m.groups.year, m.groups.month, m.groups.day);
}

// 치환: 날짜 형식 변환 YYYY-MM-DD → MM/DD/YYYY
const reformatted = text.replace(dateRe, '$<month>/$<day>/$<year>');
console.log(reformatted);
// 회의 시간: 03/12/2026, 마감: 04/01/2026

Python에서 re 모듈 사용

import re

# 모든 매치 찾기
text = '연락처: alice@example.com, bob@test.org'
emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
print(emails)  # ['alice@example.com', 'bob@test.org']

# Named Group 추출 (Python은 ?P<name> 구문 사용)
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, '게시일: 2026-03-12')
if m:
    print(m.group('year'), m.group('month'), m.group('day'))

# 치환: 전화번호 중간 4자리 마스킹
phone_re = r'(1[3-9]\d)\d{4}(\d{4})'
result = re.sub(phone_re, r'\1****\2', '전화번호: 13812345678')
print(result)  # 전화번호: 138****5678

Java에서 java.util.regex 사용

import java.util.regex.*;

class RegexDemo {
    public static void main(String[] args) {
        String text = "Error [2026-03-12 18:05:09] Connection failed";

        // 정규식 컴파일 (프로덕션에서는 Pattern 인스턴스를 캐싱해야 함)
        Pattern p = Pattern.compile(
            "(?<level>INFO|WARN|ERROR)\\s+\\[(?<time>[^\\]]+)\\]\\s+(?<message>.+)"
        );
        Matcher m = p.matcher(text);

        if (m.find()) {
            System.out.println("레벨: " + m.group("level"));
            System.out.println("시간: " + m.group("time"));
            System.out.println("메시지: " + m.group("message"));
        }

        // 모든 숫자 치환
        String cleaned = "abc123def456".replaceAll("\\d+", "*");
        System.out.println(cleaned); // abc*def*
    }
}

Authoritative References