MiServe DevTools

내 스티커

도구를 여기에 고정하세요. 이 브라우저에 저장됩니다.

JavaScript·Go(RE2) 정규식 테스터

JavaScript 엔진이나 Go의 RE2 엔진으로 텍스트에 정규식을 테스트하고, 모든 일치 항목과 캡처 그룹, 치환 결과를 확인합니다.

플래그

텍스트 속 일치 항목

두 엔진의 문법 요약표
토큰의미JavaScriptGo (RE2)
. 줄바꿈을 제외한 모든 문자. s 플래그를 켜면 줄바꿈과도 일치합니다. 지원 지원
\d \w \s 숫자, 단어 문자, 공백 문자. 대문자로 쓴 \D, \W, \S는 그 반대와 일치합니다. 지원 지원
[abc] [^abc] [a-z] 집합에 속한 문자 하나, 집합에 속하지 않은 문자 하나, 범위에 속한 문자 하나. 지원 지원
^ $ 텍스트의 시작과 끝. m 플래그를 켜면 각 줄의 시작과 끝. 지원 지원
\b \B 단어 경계, 그리고 단어 경계가 아닌 위치. 지원 지원
* + ? {2,5} 0번 이상, 1번 이상, 0번 또는 1번, 2번에서 5번. 각각 가능한 한 많이 일치합니다. 지원 지원
*? +? ?? {2,5}? 같은 수량자이지만 가능한 한 적게 일치합니다. 지원 지원
(…) (?:…) 캡처 그룹, 그리고 묶기만 하는 그룹. 지원 지원
(?<name>…) 이름 있는 캡처 그룹. Go는 1.22 버전부터 이 형식을 받아들이며, (?P<name>…)는 모든 버전에서 받아들입니다. 지원 지원
a|b a 또는 b. 지원 지원
\p{L} \p{Lu} Unicode 속성: 임의의 문자, 임의의 대문자. JavaScript에서는 u 플래그가 필요합니다. 지원 지원
(?i) (?s) (?m) 패턴 안에 쓰는 플래그. JavaScript에서는 플래그를 패턴 밖에서 지정합니다. 미지원 지원
\A \z m 플래그와 관계없이 전체 텍스트의 시작과 끝. 미지원 지원
[[:alpha:]] 집합 안에서 쓰는 POSIX 문자 클래스. 미지원 지원
(?=…) (?!…) 전방 탐색: 뒤에 오는 내용이 일치해야 하거나 일치하지 않아야 하며, 소비되지 않습니다. 지원 미지원
(?<=…) (?<!…) 후방 탐색: 앞에 오는 내용이 일치해야 하거나 일치하지 않아야 합니다. 지원 미지원
\1 \k<name> 역참조: 앞의 그룹이 일치한 것과 같은 텍스트. 지원 미지원

WebAssembly로 브라우저에서 실행됩니다. 붙여 넣은 내용은 업로드되지 않습니다.

이 도구에 대하여

두 계열의 두 엔진

정규식 엔진은 두 계열로 나뉩니다. PCRE나 JavaScript, Python, Java, .NET의 기본 엔진 같은 백트래킹 엔진은 패턴을 따라 경로 하나를 시도하다가 실패하면 되돌아갑니다. 이 설계 덕분에 전방 탐색, 후방 탐색, 역참조가 가능합니다. RE2나 Go의 regexp 패키지 같은 오토마타 엔진은 가능한 모든 경로를 동시에 따라가므로 실행 시간이 텍스트 길이에 선형으로 늘어납니다. 그 대가로 전후방 탐색과 역참조는 쓸 수 없습니다.

여기서 JavaScript 엔진은 브라우저 자체의 RegExp입니다. Go 엔진은 Go 표준 regexp 패키지를 WebAssembly로 컴파일한 것이므로, 여기서 패턴을 실행하는 코드는 Go 프로그램에서 패턴을 실행하는 코드와 같습니다. Go는 RE2 문법을 받아들입니다.

결과 읽는 법

각 일치 항목은 텍스트 안에서 테두리와 배경색으로 강조되며, 맞닿은 일치 항목을 구분할 수 있도록 두 가지 색을 번갈아 씁니다. 두 글자 사이에서 x*가 찾는 것 같은 빈 일치는 가는 막대로 표시됩니다. 표에는 모든 일치 항목의 시작과 끝 위치, 모든 캡처 그룹의 텍스트가 나옵니다. 일치에 참여하지 않은 그룹은 “일치하지 않음”으로 표시되며, 이는 빈 문자열과 일치한 그룹과는 다릅니다.

위치는 0부터 UTF-16 코드 단위로 세며, 끝 위치는 포함되지 않습니다. JavaScript에서 String.prototype.slice에 넘기는 숫자와 같습니다. Go 자체는 UTF-8 텍스트의 바이트 오프셋을 보고하지만, 이 도구가 이를 변환하므로 두 엔진 모두 같은 숫자를 보여 줍니다.

JavaScript에서 g 플래그가 없는 패턴은 첫 번째 일치만 찾고 첫 번째 일치만 치환합니다. Go 엔진은 FindAllStringSubmatchIndex와 ReplaceAllString처럼 항상 모든 일치 항목을 보고합니다.

치명적 백트래킹

백트래킹 엔진은 수량자가 중첩되거나 겹치면 지수 시간이 걸릴 수 있습니다. 대표적인 예는 a가 길게 이어지다가 다른 문자로 끝나는 텍스트에 (a+)+$를 테스트하는 경우입니다. 엔진은 포기하기 전에 이어진 문자열을 안쪽 수량자와 바깥쪽 수량자에 나눠 주는 모든 방법을 시도합니다. 서버에서는 이것이 ReDoS라고 불리는 서비스 거부 위험이 됩니다.

이 도구는 JavaScript 패턴을 백그라운드 워커에서 실행하고 1.5초가 지나면 워커를 중지하므로, 페이지가 멈추지 않고 무슨 일이 있었는지 알려 줍니다. 같은 패턴을 Go 엔진으로 테스트해 보면 느린 원인이 백트래킹인지 빠르게 확인할 수 있습니다. Go는 텍스트 길이에 선형인 실행 시간을 보장하기 때문입니다.

자주 묻는 질문

JavaScript에서는 되는 패턴이 Go에서는 왜 안 되나요?

흔한 원인은 전방 탐색, 후방 탐색, 역참조입니다. RE2는 선형 실행 시간을 보장하려고 이 기능들을 빼 두었습니다. 플래그도 흔한 원인입니다. Go에는 패턴 밖에 쓰는 플래그가 없으므로, 대소문자를 무시하려면 패턴 맨 앞에 (?i)를 씁니다.

JavaScript와 Go의 치환 문자열은 어떻게 다른가요?

둘 다 첫 번째 그룹은 $1입니다. 이름 있는 그룹은 JavaScript에서 $<name>, Go에서 ${name}입니다. Go에서 $1x는 1x라는 이름의 그룹을 뜻하므로, 참조 뒤에 문자, 숫자, 밑줄이 이어지면 ${1}x로 쓰세요.

PCRE, Python, Java 패턴도 여기서 테스트할 수 있나요?

이 페이지에서 실행되는 엔진은 JavaScript와 Go뿐입니다. 일상적으로 쓰는 문법은 정규식 방언 사이에 공통이므로 간단한 패턴이라면 JavaScript 엔진으로도 충분히 비슷한 결과를 볼 수 있습니다. 하지만 소유 수량자, 원자 그룹, 재귀 같은 기능은 여기 있는 어느 엔진에서도 쓸 수 없습니다.

테스트하는 텍스트가 서버로 전송되나요?

아니요. 두 엔진 모두 브라우저에서 실행됩니다. JavaScript는 백그라운드 워커에서, Go는 WebAssembly 모듈로 실행됩니다. 이 도구는 패턴이나 텍스트로 네트워크 요청을 보내지 않으며, 사이트의 보안 정책이 다른 호스트로 가는 요청을 차단합니다.

텍스트의 다른 도구