정규식 테스터
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
무료 온라인 정규식 테스터(Regex Tester). JS 실시간 매칭 테스트, Capture Group/Named Group 확인, 치환 미리보기, 정규식 구문 설명 지원. Web Worker ReDoS 타임아웃 보호 내장, 자주 쓰는 정규식 템플릿 라이브러리 포함. 개발자가 정규식을 빠르게 디버깅하고 검증하는 데 최적입니다.
还没有匹配结果
输入正则与文本后,这里会展示每个匹配、捕获组和命名分组。
统计
命名分组汇总
当前没有命名分组。
무료 온라인 정규식 테스터(Regex Tester). JS 실시간 매칭 테스트, Capture Group/Named Group 확인, 치환 미리보기, 정규식 구문 설명 지원. Web Worker ReDoS 타임아웃 보호 내장, 자주 쓰는 정규식 템플릿 라이브러리 포함. 개발자가 정규식을 빠르게 디버깅하고 검증하는 데 최적입니다.
ReDoS(Regular Expression Denial of Service, 정규식 서비스 거부 공격)는 악의적으로 작성된 정규식 패턴(예: 긴 문자열에 `(a+)+$` 매칭)이 치명적인 백트래킹(catastrophic backtracking)을 유발하여 CPU 사용률 100%, 브라우저 프리징, 서버 크래시를 일으키는 현상입니다. 이 도구는 Web Worker 샌드박스에서 정규식 매칭을 실행하고 500ms 타임아웃으로 자동 중단하므로, 백트래킹을 유발하는 악성 정규식을 입력해도 브라우저가 멈추지 않습니다 — 이것이 이 도구의 핵심 보안 기능입니다.
g(global)는 첫 번째 매치가 아닌 모든 매치를 찾습니다; i(ignoreCase)는 대소문자를 구분하지 않습니다; m(multiline)은 ^와 $가 각 줄의 시작/끝에 매치되도록 합니다; s(dotAll)은 닷(.)이 개행 문자를 포함한 모든 문자에 매치되도록 합니다; u(unicode)는 Unicode 모드로 emoji와 멀티바이트 문자를 올바르게 처리합니다; y(sticky)는 lastIndex 위치에서 정확히 매치하는 스티키 매칭을 수행합니다. 이 도구는 여섯 개 Flags의 시각적 토글 버튼을 제공하여 클릭으로 실시간 on/off할 수 있습니다.
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, $2...는 N번째 Capture Group을 나타냅니다; $&는 매치된 전체 텍스트를 나타냅니다; $`는 매치된 텍스트 앞부분을 나타냅니다; $'는 매치된 텍스트 뒷부분을 나타냅니다; $$는 리터럴 $를 나타냅니다; $<name>은 Named Group을 나타냅니다. 예를 들어 `(\d{4})-(\d{2})-(\d{2})`를 `$2/$3/$1`로 치환하면 2026-03-12가 03/12/2026로 변환됩니다. 이 도구의 치환 영역에는 이러한 특수 기호의 빠른 삽입 버튼이 마련되어 있습니다.
정규식(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 같은 성능 함정에도 주의해야 합니다.
| 메타문자 | 의미 | 예시 |
|---|---|---|
. | 임의의 단일 문자(개행 제외, 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?)\b | g |
| 날짜 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 |
// 이메일 형식 검증
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/2026import 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****5678import 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*
}
}