UltKit

정규식 테스트

패턴을 입력하고 필요한 플래그를 선택한 뒤 텍스트를 붙여 넣으세요. 입력하는 즉시 모든 일치 항목이 강조되고, 위치와 캡처 그룹이 함께 목록으로 표시됩니다. 패턴은 브라우저 자체의 JavaScript 정규식 엔진으로 실행되므로 결과가 내 코드와 똑같고, 텍스트는 기기 밖으로 나가지 않습니다.

플래그

0자 · 0단어 · 0줄

일치하는 부분이 여기에 강조 표시됩니다.

0자 · 0단어 · 0줄

이 브라우저 탭 안에서만 처리됩니다. 입력한 텍스트는 업로드되거나 저장되지 않습니다.

JavaScript 정규식 토큰

첫 번째 일치 열은 이 페이지를 빌드한 JavaScript 엔진으로 각 패턴을 해당 텍스트에 실행해 얻은 결과입니다.

토큰의미패턴텍스트첫 번째 일치
\d숫자 0–9/\d+/Order 66 shipped66
\w영문자, 숫자, 밑줄(ASCII)/\w+/snake_case-idsnake_case
\s탭과 줄바꿈을 포함한 공백 문자/\s+/two spaces
.줄바꿈을 제외한 모든 문자(s 사용 시 포함)/a.c/abc a-cabc
^ $입력의 시작과 끝(m 사용 시 줄의 시작과 끝)/^\w+$/singlesingle
[abc]나열된 문자 중 하나/[aeiou]/rhythm and bluesa
[^abc]나열되지 않은 모든 문자/[^0-9]+/2026-10-18-
* + ?0개 이상, 1개 이상, 0개 또는 1개/colou?r/color colourcolor
{n,m}n번 이상 m번 이하/\d{2,4}/7 42 1999 12345642
(…)캡처 그룹/(\d+)px/width: 320px320px
(?<name>…)이름 있는 캡처 그룹/(?<h>\d\d):(?<m>\d\d)/at 09:4509:45
(?:…)캡처하지 않는 그룹/(?:ab)+/ababab!ababab
a|b둘 중 하나/cat|dog/hotdogdog
\b단어 경계/\bcat\b/concat catcat
(?=…)뒤에 오는 것(전방 탐색)/\d+(?=%)/50 of 75%75
(?<!…)앞에 오지 않는 것(부정 후방 탐색)/(?<!\$)\b\d+/$30 or 4040
\p{L}모든 유니코드 문자(u 필요)/\p{L}+/unaïve 東京naïve

여섯 가지 플래그와 그 효과

g(global)는 첫 번째 일치에서 멈추지 않고 모든 일치 항목을 찾습니다. 이 플래그가 없으면 목록에는 하나만 나옵니다. i는 대소문자를 무시합니다. m(multiline)은 ^와 $가 전체 텍스트의 처음과 끝뿐 아니라 각 줄의 처음과 끝에서도 일치하게 하며, 줄 끝 공백 같은 패턴에 필요합니다. s(dotAll, ES2018에 추가)는 .이 줄바꿈과도 일치하게 합니다. u(unicode)는 텍스트를 코드 포인트 단위로 다뤄 이모지를 한 글자로 세고, 모든 문자 체계의 글자를 뜻하는 \p{L} 같은 속성 이스케이프를 쓸 수 있게 합니다. y(sticky)는 현재 위치에서만 일치를 찾으며, 토크나이저가 쓰는 방식입니다. JavaScript에는 일치 인덱스를 위한 d와 문자 클래스 집합 연산을 위한 v도 있지만, 이 테스트 도구는 위의 여섯 가지만 다룹니다.

테스트 텍스트 아래에는 각 일치 항목의 인덱스와 그룹이 표시됩니다. 번호 그룹은 일반 괄호로 만들고, (?:…)는 캡처하지 않는 그룹이며, (?<year>\d{4})는 이름으로 표시되는 이름 있는 그룹을 만듭니다. ISO 날짜 예시가 이를 보여 줍니다. 자주 쓰는 패턴 메뉴는 이메일 주소, URL, IPv4 주소, 16진수 색상, UUID, 반복된 단어, 줄 끝 공백에 대해 검증된 출발점을 넣어 줍니다. 이메일 패턴은 유효성 검사가 아니라 대략적인 확인용으로 보세요. 실제 주소 문법은 훨씬 관대하며, 진짜 확인 방법은 메일을 보내 보는 것뿐입니다.

후방 탐색과 치명적 백트래킹

전후방 탐색은 위치를 소비하지 않고 그 주변을 검사합니다. 전방 탐색 (?=…)와 (?!…)는 처음부터 JavaScript에 있었고, 후방 탐색 (?<=…)와 (?<!…)는 ES2018에 추가되어 2023년 Safari 16.4가 지원하면서 모든 주요 브라우저에서 쓸 수 있게 되었습니다. 그래서 (?<=\$)\d+는 "$42"에서 달러 기호를 빼고 42만 찾습니다. 다른 많은 엔진과 달리 JavaScript는 길이에 제한 없는 후방 탐색을 허용합니다.

JavaScript 엔진은 백트래킹 방식입니다. 한 경로가 실패하면 되돌아가 다른 선택지를 시도합니다. (a+)+$처럼 수량자가 중첩되면 같은 텍스트를 나누는 방법이 기하급수적으로 늘어나, a 30개 뒤에 x가 붙은 문자열만으로도 몇 초가 걸리고 글자 몇 개가 더해지면 몇 시간이 걸릴 수 있습니다. 이것이 치명적 백트래킹이며, 서버에서는 서비스 거부 공격인 ReDoS가 됩니다. 2019년 7월 2일에는 이런 결함이 있는 WAF 규칙 하나 때문에 Cloudflare 네트워크가 약 30분 동안 멈췄습니다. 이 테스트 도구는 내 탭에서 실행되므로 그런 패턴은 페이지를 멈추게 할 수 있습니다. 새로고침한 뒤 .* 대신 [^,]*처럼 더 좁은 클래스나 앵커를 써서, 두 수량자가 같은 문자를 두고 다투지 않도록 다시 작성하세요. 텍스트를 찾는 대신 직접 편집하려면 텍스트 도구를, 다른 개발용 유틸리티는 개발자 도구 허브를 보세요.

자주 묻는 질문

정규식이 일치 항목을 하나만 찾는 이유는 무엇인가요?
g 플래그가 꺼져 있기 때문입니다. 이 플래그가 없으면 엔진은 첫 번째 일치 후에 멈춥니다. g를 선택하면 모든 항목이 나열됩니다. y 플래그만 켜도 여러 개를 찾지만, 일치 항목이 바로 이어질 때만 그렇습니다.
JavaScript에서 \d는 다른 문자 체계의 숫자와도 일치하나요?
아니요. JavaScript에서 \d는 0부터 9까지만, \w는 ASCII 영문자, 숫자, 밑줄만 뜻하며 u 플래그를 켜도 마찬가지입니다. 다른 문자 체계에는 u와 함께 \p{Nd}나 \p{L}을 쓰세요.
여기서 테스트한 패턴이 Python이나 PHP에서도 똑같이 동작하나요?
기본 문법은 통하지만 세부 사항이 다릅니다. Python의 이름 있는 그룹은 (?P<name>…)로 쓰고, PHP와 Python은 JavaScript에 없는 소유 수량자를 지원하며, 후방 탐색 규칙도 서로 다릅니다. 대상 엔진에서 다시 테스트하세요.
점이나 대괄호 문자 자체를 찾으려면 어떻게 하나요?
백슬래시로 이스케이프합니다. \.은 마침표, \[는 여는 대괄호와 일치합니다. 문자 클래스 안에서는 대부분의 기호가 이미 문자 그대로이므로 [.]도 점 하나와만 일치합니다.
패턴을 입력하는 중에 페이지가 멈춘 이유는 무엇인가요?
패턴이 텍스트에서 치명적 백트래킹을 일으켰을 가능성이 높습니다. 새로고침한 뒤 (.*)*나 (a+)+ 같은 중첩 수량자를 피하고, 각 부분이 가능한 한 적게 일치하도록 만드세요.