정규식 테스트 소개
정규식(정규 표현식, regex)은 "숫자 네 개, 하이픈, 숫자 두 개"처럼 텍스트의 패턴을 나타내는 방법으로, 코드, 편집기, 명령줄 도구, 스프레드시트에서 텍스트를 검색하고 검증하고 바꿀 때 씁니다. 일치 결과를 바로 볼 수 있으면 원하는 것과 정확히 일치하는 패턴을 훨씬 쉽게 만들 수 있습니다.
이 테스트 도구는 브라우저에 내장된 JavaScript 정규식 엔진을 그대로 쓰므로, JavaScript와 Node.js의 RegExp, match, replace와 같은 결과가 나옵니다. 입력하는 대로 일치 항목을 강조하고, 모든 일치 항목을 위치와 캡처 그룹과 함께 나열하며, 치환 모드에서는 치환 문자열을 적용한 결과를 보여 줍니다.
패턴은 시간 제한이 있는 백그라운드 워커에서 실행되므로, 치명적인 백트래킹이 일어나는 패턴도 페이지를 멈추게 하지 못합니다. 패턴과 텍스트는 브라우저 밖으로 나가지 않습니다.
사용 방법
- "정규식"에 앞뒤 슬래시 없이 패턴을 입력하거나 "예시" 중 하나를 클릭하세요.
- "플래그"를 켜거나 끄세요. g, i, m, s, u, y를 쓸 수 있고, 브라우저가 지원하면 d와 v도 쓸 수 있습니다.
- "테스트 텍스트"에 검색할 텍스트를 붙여넣으세요. 일치 항목은 "강조된 일치 항목"에 표시되고, "일치 항목 상세"에 위치, 길이, 그룹과 함께 나열됩니다.
- "모드"에서 "치환"을 고르고 $<day>/$<month>/$<year> 같은 "치환 문자열"을 입력하면 "치환한 결과"가 표시됩니다. "결과 복사"를 클릭해 가져가세요.
- 테스트 도구 아래의 "빠른 참조"에서 문법을 찾아보고, 처음부터 다시 하려면 "지우기"를 누르세요.
기능
- 실시간 강조와 일치 항목 상세: 모든 일치 항목을 텍스트에 강조하고 위치, 길이, 번호 있는 캡처 그룹과 이름 있는 캡처 그룹을 함께 나열합니다. 빈(길이 0) 일치는 가는 표시로 보여 주며, d 플래그를 켜면 각 그룹의 시작과 끝 위치도 포함합니다.
- 치환 미리보기: JavaScript 문법으로 치환을 테스트합니다. 그룹은 $1과 $<name>, 일치한 전체는 $&, 일치 항목 앞과 뒤의 텍스트는 $`와 $', 달러 기호는 $$로 씁니다.
- 실제 JavaScript 엔진: 브라우저의 RegExp 구현으로 일치를 찾으므로, 동작과 문법 오류가 JavaScript 코드에서 보게 될 것과 정확히 같습니다.
- 폭주하는 패턴 차단: 각 실행은 Web Worker에서 이루어지며 1.5초가 지나면 멈춥니다. 탭이 멈추는 대신 치명적인 백트래킹에 대한 설명이 표시됩니다.
- 예시와 빠른 참조: 이메일 형태의 텍스트, ISO 날짜, Hex 색상, 반복된 단어를 찾는 간단한 패턴을 불러오고, 자주 쓰는 토큰과 치환 코드를 한눈에 찾아볼 수 있습니다.
사용 예
날짜 형식 바꾸기
"ISO 날짜" 예시를 불러오고 "치환"으로 바꾸세요. 패턴이 연, 월, 일을 이름 있는 그룹으로 캡처하고, 치환 문자열 $<day>/$<month>/$<year>가 2024-03-15를 15/03/2024로 바꿉니다.
중복된 단어 찾기
패턴 \b(\w+)\s+\1\b에 i 플래그를 켜면 "is is"와 "the the"를 찾습니다. 반복된 단어가 다음 줄로 넘어가도 찾아냅니다. $1로 치환하면 중복이 사라집니다.
CSS에서 색상 추출하기
#(?:[0-9a-f]{6}|[0-9a-f]{3})\b에 g와 i 플래그를 켜면 스타일시트의 모든 3자리와 6자리 hex 색상이 일치 목록에 나오고, #12345G 같은 잘못된 값은 건너뜁니다.
느린 패턴 진단하기
"느린 패턴(데모)" 예시 ^(a+)+$를 "a"가 길게 이어지다 "b"로 끝나는 텍스트에 적용하면 1.5초 뒤에 경고와 함께 멈춥니다. 문제는 중첩된 +이며, ^a+$는 같은 텍스트에 즉시 일치합니다.
제한 사항과 참고
- JavaScript 정규식 문법만 지원합니다. 소유 수량자, 원자 그룹, 재귀, \A와 \Z처럼 다른 정규식 방언의 기능은 쓸 수 없으며, 정확히 어떤 문법을 지원하는지는 브라우저에 따라 다릅니다.
- 테스트 텍스트는 200,000자까지입니다. 일치 항목은 5,000개까지 나열하고 강조하지만, 일치 개수와 치환 모드에는 모든 일치 항목이 반영됩니다.
- 각 실행은 1.5초가 지나면 멈춥니다. 따라서 문제가 없는 패턴이라도 아주 무거운 패턴을 긴 텍스트에 적용하면 멈출 수 있습니다.
- JavaScript와 마찬가지로 g 플래그가 없으면 첫 번째 일치 항목만 찾고 치환합니다.
- 예시 패턴은 학습과 빠른 검색을 위해 일부러 단순하게 만들었습니다. 완전한 검증 규칙이 아니어서, 예를 들어 날짜 예시는 2024-02-30도 받아들입니다.
- 위치와 길이는 JavaScript와 같이 UTF-16 코드 단위로 세므로 이모지는 두 글자로 셉니다.
자주 묻는 질문
이 테스트 도구는 어떤 정규식 방언을 쓰나요?
브라우저 엔진이 실행하는 JavaScript(ECMAScript) 정규식입니다. 여기서 동작하는 패턴은 JavaScript와 Node.js 코드에서도 똑같이 동작합니다. Python, PCRE(PHP), Java의 패턴도 대체로 비슷하지만 후방 탐색 지원, 인라인 플래그, 이름 있는 그룹 문법 같은 세부 사항이 다릅니다.
패턴이 일치 항목을 하나만 찾는 이유는 무엇인가요?
g(global) 플래그를 켜세요. 이 플래그가 없으면 JavaScript는 일치를 찾을 때와 치환할 때 모두 첫 번째 일치 항목에서 멈춥니다.
치명적인 백트래킹은 무엇인가요?
(a+)+나 (\w|\d)*처럼 수량자가 중첩되거나 겹치는 패턴은 거의 일치하는 텍스트에서 지수적으로 많은 경우의 수를 시도할 수 있습니다. 그러면 엔진이 몇 분씩 실행될 수도 있습니다. ^(a+)+$ 대신 ^a+$를 쓰는 것처럼 패턴을 더 구체적으로 만들면 대개 해결됩니다.
치환 문자열에서 캡처한 그룹을 어떻게 쓰나요?
번호 있는 그룹은 $1, $2처럼 쓰고, (?<name>…)으로 쓴 그룹은 $<name>으로 씁니다. $&는 일치한 전체를, $$는 달러 기호 자체를 넣습니다.
슬래시를 이스케이프해야 하나요?
이 테스트 도구에서는 필요 없습니다. 입력 상자 양옆의 슬래시는 장식일 뿐이며, 패턴은 new RegExp()에 그대로 전달됩니다. /a\/b/ 같은 JavaScript 정규식 리터럴 안에서는 슬래시를 이스케이프해야 합니다.
텍스트가 서버로 전송되나요?
아닙니다. 일치 검색은 이 페이지 안의 Web Worker에서 실행되며, 패턴과 텍스트 모두 네트워크로 전송되지 않습니다.