정규식 테스터

정규식 테스터
Live matching with capture groups. Runs against a time limit so a runaway pattern cannot freeze the page.

g
i
m
s
u

2개 일치
Contact: ada@example.com, grace@navy.com — not an email: nope@

정규식을 입력하는 즉시 예제 텍스트에 적용해 봅니다. 캡처 그룹과 플래그를 따로 보여줘서 무엇이 왜 매칭됐는지 확인할 수 있습니다.

맞아 보이는데 아무것도 매치되지 않는 정규식은 대개 의도와 조금 다릅니다. 마침표를 뜻하려던 점이 아무 문자나 잡고 있거나, 탐욕적 수량자가 원하던 지점을 지나쳐 삼키고 있거나, 여러 줄 입력인데 앵커가 "문자열의 시작"을 뜻하고 있는 식입니다.

샘플 텍스트 위에 매치가 실시간으로 표시되고 캡처 그룹이 따로 나열되므로, 패턴의 어느 부분이 입력의 어느 부분을 가져갔는지 눈으로 확인할 수 있습니다. 엔진은 자바스크립트의 정규식 엔진 — 여러분 코드가 실제로 돌릴 그것 — 이라 lookbehind, 이름 있는 그룹, u·s 플래그가 운영 환경과 똑같이 동작합니다. PCRE와 다르게 동작하는 지점까지 포함해서입니다.

플래그는 패턴을 이루는 대부분의 문자보다 의미를 크게 바꿉니다. m 없이는 ^ 와 $ 가 문자열 전체의 처음과 끝만 가리키므로, 한 줄에서 잘 되던 패턴이 여러 줄에서는 조용히 아무것도 잡지 못합니다. s 없이는 점이 줄바꿈을 넘지 않습니다. g 플래그는 자바스크립트에서 정규식을 상태를 가진 객체로 만듭니다. 호출 사이에 lastIndex 가 남기 때문에, 같은 객체를 반복문에서 재사용하면 결과가 한 칸씩 건너뛰는 현상이 생깁니다. 패턴 옆에서 플래그를 함께 보는 것이 이런 것들을 코드에 넣기 전에 잡는 방법입니다.

파국적 백트래킹은 틀린 답을 내는 것이 아니라 서비스를 멈추게 하는 실패입니다. 겹치는 대안 위에 중첩된 수량자, 전형적으로는 반복을 품은 그룹이 다시 반복되는 모양이면, 매칭에 그냥 실패할 뿐인 입력 하나에도 엔진이 지수적으로 많은 경로를 훑게 만들 수 있습니다. 증상은 짧은 문자열에서는 즉시 끝나던 정규식이 조금 더 긴 입력에서 멈추는 것입니다. 이 페이지에서 샘플을 늘릴수록 느려진다면 그것이 이유이고, 해결은 대개 안쪽 반복이 같은 텍스트를 두 가지 방식으로 매칭할 수 없게 만드는 것입니다.

자바스크립트는 PCRE가 아니라서, 파이썬이나 PHP 답변에서 복사한 패턴이 다르게 동작할 수 있습니다. 후방탐색은 현대 자바스크립트에 있지만 오래된 엔진이 도는 모든 환경에서 쓸 수 있는 것은 아니고, 이름 있는 그룹은 파이썬과 문법이 다르며, 소유 수량자와 원자 그룹은 아예 없습니다. 숫자 클래스는 u 플래그가 없으면 ASCII 숫자만 매칭하는 반면 다른 엔진 중에는 기본적으로 다른 숫자 체계까지 포함하는 것도 있습니다. 이 페이지는 브라우저 자체 엔진으로 돌아가므로, 여기서 보이는 결과가 근사치가 아니라 실제 코드가 받게 될 결과입니다.

정규식 테스터 사용법

  1. 앞뒤 슬래시 없이 패턴만 입력합니다.
  2. 필요한 플래그를 켭니다. g는 전체 매칭, i는 대소문자 무시, m은 여러 줄입니다.
  3. 테스트 텍스트를 붙여넣고 매칭이 갱신되는 것을 봅니다.
  4. 각 매칭의 캡처 그룹을 확인합니다.

알아두면 좋은 점

  • 조금씩 키워 가세요. 한 경우만 잡는 최소 패턴에서 시작해 확인한 뒤 넓히는 편이, 긴 정규식을 한 번에 쓰고 디버깅하는 것보다 훨씬 쉽습니다.
  • 점을 문자 그대로 쓰려면 이스케이프하세요. 이스케이프하지 않은 .은 아무 문자나 잡아서, 사실은 너무 헐거운 패턴이 잘 동작하는 것처럼 보이게 만듭니다.
  • 구분자 사이를 잡을 때는 .*?처럼 게으른 수량자를 쓰세요. 탐욕적인 .*는 그 줄의 마지막 구분자까지 달려갑니다.
  • 자바스크립트 정규식 엔진을 씁니다. 다른 엔진의 lookbehind나 소유 수량자 같은 PCRE 기능은 동작이 다를 수 있습니다.

자주 묻는 질문

g 플래그를 켰는데 아무것도 안 잡힙니다

전역 정규식은 호출 사이에 lastIndex를 유지합니다. 이 도구는 실행마다 초기화하므로, 매칭이 없다면 패턴 자체가 안 맞는 것입니다. 앵커부터 빼 보세요.

이름 있는 캡처 그룹도 되나요?

됩니다. (?<name>...)이 동작하며 결과에 이름으로 표시됩니다.

정규식 때문에 페이지가 멈출 수도 있나요?

중첩 수량자에서 발생하는 파국적 백트래킹은 매우 느릴 수 있습니다. 무한 루프는 막아 두었지만 (a+)+$ 같은 병적인 패턴을 긴 문자열에 쓰는 것은 피하는 편이 좋습니다.