정규식 테스터

정규식을 그 자리에서 검증. 매치와 캡처 그룹 확인, 치환 미리보기, 분할까지 JavaScript 의미론으로.

플래그
테스트 텍스트
결과

패턴과 텍스트를 입력하면 결과가 표시됩니다

이 도구가 하는 일

정규식은 텍스트 패턴을 기술하는 간결한 언어이고, 그것을 확실히 쓰는 유일한 방법은 실제 텍스트에 대해 돌려 보는 것입니다. 이 테스터는 그것을 세 모드로 실시간에 합니다. 매치는 패턴이 매치되는 모든 자리를 텍스트에 강조하고, 각 캡처 그룹을 아래에 나열합니다. 치환은 $1과 lt;name> 참조를 포함해 String.replace가 낼 것을 미리 봅니다. 분할은 String.split이 텍스트를 어떻게 잘라 내는지 — 출력에 나타나는 캡처된 구분자처럼 사람이 잘 예측하지 못하는 부분까지 — 보여 줍니다.

패턴은 사용자의 브라우저 자체 JavaScript 엔진에서 돕니다. 그 흉내가 아닙니다. 여기서 매치되는 것은 당신의 JavaScript 코드에서 매치되는 것과 1바이트까지 정확히 같습니다. 일하는 것이 같은 엔진이기 때문입니다.

매치 결과 읽기

모든 매치는 테스트 텍스트에 강조되고, 그 위치 — 시작과 끝의 문자 오프셋 — 와 함께 아래에 나열됩니다. 패턴이 캡처 그룹을 담으면 각 그룹이 그 매치 아래에 캡처한 값과 함께 나타납니다. 그룹은 여는 괄호로 왼쪽에서 오른쪽으로 번호가 매겨집니다. 엔진이 $1, $2와 역참조에 매기는 그대로입니다. 이름 있는 그룹은 번호 옆에 이름을 보입니다. 매치에 참여하지 않은 그룹 — 예를 들어 선택의 진 쪽 — 은 빈 문자열이 아니라 그렇게 표시됩니다. 당신의 코드에 그것들은 다른 것이기 때문입니다: undefined냐 ""냐입니다.

패턴은 정당하게 0글자에 매치될 수 있습니다 — ^, \b, 빈 선택지 모두 그럴 수 있습니다. 그런 길이 0의 매치는 아무것도 강조하지 않으므로, 이 도구는 그 위치를 가는 선으로 표시해 매치가 어디로 갔나 헷갈리지 않게 합니다.

플래그

플래그는 패턴 전체의 동작을 바꾸며, 그중 둘이 대부분의 정규식 혼란을 일으킵니다:

  • g(전역) — 첫 매치만이 아니라 모든 매치를 찾습니다. 이것이 없으면 매치는 하나만 표시하고 치환은 한 곳만 바꿉니다. 사람이 가장 자주 잊는 플래그입니다.
  • i(대소문자 무시) — 글자가 대소를 가리지 않고 매치됩니다.
  • m(여러 줄) — ^와 $가 텍스트 전체만이 아니라 모든 줄의 시작과 끝에 매치됩니다.
  • s(dotAll) — 점이 줄바꿈 문자에도 매치됩니다. 이것이 없으면 .은 모든 줄바꿈에서 멈춥니다.
  • u(유니코드) — 패턴이 코드 포인트로 돌아 이모지와 기본 범위 밖 문자가 올바르게 동작하고 \p{…} 속성 이스케이프를 쓸 수 있게 됩니다.
  • y(스티키) — 매치가 이전 매치가 끝난 바로 그 자리에서 시작해야 합니다. 토크나이저에 유용하고 그 밖에서는 의외입니다.
  • d(인덱스) — 엔진이 각 그룹의 정확한 위치를 기록합니다. 무엇이 매치되는지는 바꾸지 않습니다.

치환 참조

치환 텍스트는 문자 그대로 취해지지 않습니다 — 몇몇 $ 나열이 매치마다 펼쳐집니다. $1부터 $9는 번호 있는 그룹이 캡처한 것을, lt;name>은 이름 있는 그룹을, amp;는 매치 전체를 넣고, $는 문자 그대로의 달러 기호를 냅니다. 그 밖은 모두 그대로 복사됩니다.

"2026-07-20".replace(/(?<y>\d{4})-(\d{2})-(\d{2})/, "$3.$2.lt;y>")
// → "20.07.2026"

몸에 새길 만한 JavaScript 동작 하나: g 플래그가 없으면 치환은 첫 자리만 바꿉니다. 이 도구의 버릇이 아니라 — 당신의 코드가 그렇게 합니다. 이 도구는 g가 꺼졌을 때 힌트를 보여 단일 치환이 버그로 읽히지 않게 합니다.

분할이 실제로 하는 동작

정규식으로 하는 String.split에는 노련한 개발자마저 정기적으로 놀라게 하는 두 동작이 있고, 분할 모드는 주로 그것들을 보이게 하려고 있습니다. 첫째, 패턴이 캡처 그룹을 담으면 그것이 캡처하는 것이 조각들 사이에서 출력 배열에 짜여 들어갑니다 — "a,b"를 (,)로 분할하면 세 부분이 됩니다: a, 쉼표, b입니다. 둘째, 텍스트의 맨 처음이나 끝에서의 매치, 또는 이웃한 두 매치는 출력에 빈 문자열을 내며, 이 도구는 그것을 숨기지 않고 명시적으로 보입니다.

"a,b".split(/(,)/)   // → ["a", ",", "b"]
",a,".split(/,/)     // → ["", "a", ""]

폭주하는 패턴은 견디는 것이 아니라 멈춘다

어떤 패턴은 함정입니다. (a+)+ 같은 중첩 수량자를 거의 매치되는 긴 문자열에 대해 시도하면 엔진이 포기하기 전에 기하급수적으로 많은 조합을 다시 시도하게 됩니다 — 이를 파국적 백트래킹이라 하며 브라우저 탭을 몇 분간 얼릴 수 있습니다. 이 도구는 패턴을 별도의 워커 스레드에서 돌리고 2초 후 멈추므로, 폭주하는 패턴은 얼어붙은 페이지가 아니라 메시지 하나로 끝납니다. 그 메시지를 만나면 패턴에서 중첩 수량자나 겹치는 선택지를 찾으세요. 고치는 법은 대개 안쪽 반복과 바깥쪽 반복이 같은 텍스트에 매치하지 못하게 하는 것입니다.

이 사이트의 모든 도구와 마찬가지로 패턴도 텍스트도 기기 밖으로 나가지 않습니다 — 워커는 서버가 아니라 페이지의 일부입니다.

자주 묻는 질문

이 테스터는 어떤 정규식 계열을 쓰나요?
JavaScript(ECMAScript)입니다. 패턴이 브라우저 자체 엔진에서 돌기 때문입니다. 이름 있는 그룹, 후방 탐색, \p{…} 유니코드 속성 이스케이프는 모두 최신 JavaScript와 같이 동작합니다. PCRE나 Python 패턴도 대체로 이어지지만, JavaScript에 없는 구성 — 소유 수량자, 원자 그룹, \A, \z — 은 거부되거나 다른 뜻이 됩니다.
제 패턴이 매치를 하나만 찾는 이유는 무엇인가요?
거의 늘: g 플래그가 꺼져 있습니다. 이것이 없으면 JavaScript는 첫 매치에서 멈추고 치환은 첫 자리만 바꿉니다. g 체크박스를 켜서 텍스트 전체를 검색하세요.
그룹의 "참여하지 않음"은 무슨 뜻인가요?
그룹이 패턴에는 있지만 이 특정 매치에서는 쓰이지 않았다는 뜻입니다 — 대개 진 선택의 가지에 있거나 0회 매치된 수량자 아래에 있기 때문입니다. 코드에서 그 값은 undefined이고, 빈 문자열을 캡처하는 것과는 다르므로 이 도구는 둘을 구분해 둡니다.
제 패턴이나 텍스트가 서버로 전송되나요?
아니요. 매치는 전적으로 브라우저 안, 같은 페이지의 워커 스레드 안에서 돕니다. 2초 안전 타임아웃도 로컬에서 걸립니다 — 입력한 내용이 기기 밖으로 나가지 않습니다.