본문으로 건너뛰기
LeedyBox
후원

정규식 테스트, 치환 & 치트시트

정규식의 일치 결과와 캡처 그룹을 강조해 보여 주고, 치환 결과를 미리 보며, 6개 언어의 코드로 복사할 수 있습니다.

플래그
일치: 0

일치 상세 및 캡처 그룹

치트시트

패턴을 누르면 예시 텍스트와 함께 불러옵니다.

문법 요약

문자

.줄바꿈을 제외한 모든 문자 (s 플래그 사용 시 줄바꿈 포함)
\d \D숫자 0–9 / 숫자가 아닌 문자
\w \W단어 문자(A–Z, a–z, 0–9, _) / 단어 문자가 아닌 것
\s \S공백 문자 / 공백이 아닌 문자
[abc] [^abc]a, b, c 중 하나 / a, b, c를 제외한 문자
[a-z]a부터 z까지 범위의 문자
\p{L}모든 언어의 문자 (u 플래그 필요)
\. \\ \(특수문자를 문자 그대로 찾을 때 이스케이프

수량자

* + ?0개 이상 / 1개 이상 / 0 또는 1개
{n} {n,} {n,m}정확히 n개 / n개 이상 / n개 이상 m개 이하
*? +? {n,m}?게으른 수량자: 가능한 한 적게 일치

앵커

^ $텍스트의 시작 / 끝 (m 플래그 사용 시 각 줄)
\b \B단어 경계 / 단어 경계가 아닌 위치

그룹 & 전후방 탐색

(…)캡처 그룹, $1, $2 …로 참조
(?:…)캡처하지 않는 그룹
(?<name>…)이름 있는 그룹, $<name>으로 참조
\1 \k<name>역참조: 그룹이 일치한 것과 같은 텍스트
a|ba 또는 b
(?=…) (?!…)뒤에 오는 것 / 뒤에 오지 않는 것
(?<=…) (?<!…)앞에 오는 것 / 앞에 오지 않는 것

치환

$1 $<name>번호 또는 이름 있는 그룹의 텍스트
$& $$전체 일치 / 문자 $ 그대로

사용하기 전에 결과를 확인하세요. 이 도구는 보증 없이 있는 그대로 제공되며, 결과가 불완전하거나 틀릴 수 있습니다. 이용약관

패턴은 JavaScript 정규식 엔진으로 테스트합니다. 다른 언어나 데이터베이스에서는 문법과 동작이 다를 수 있습니다. 치트시트의 패턴은 실용적인 예시이며 완전한 검증기가 아닙니다.

사용 방법

  1. "정규식"에 앞뒤의 슬래시와 플래그를 빼고 패턴만 입력한 뒤, "테스트 문자열"에 텍스트를 붙여넣으세요. 입력하는 동안 "일치"에 일치 항목이 강조되고 개수가 표시됩니다. 예시에서 시작하려면 "치트시트"에서 패턴을 누르세요. 이때 현재 패턴, 플래그, 테스트 문자열, 치환 설정이 모두 바뀝니다.
  2. "플래그"에서 필요한 플래그를 체크하세요. 글자 위에 마우스를 올리면 그 플래그의 기능이 표시됩니다. 페이지를 열면 g와 u가 켜져 있습니다. g가 없으면 첫 번째 일치 항목만 찾고, 치환도 첫 번째 항목만 합니다.
  3. "일치 상세 및 캡처 그룹"을 확인하세요. 각 일치 항목이 위치와 함께 나오고, 모든 그룹의 텍스트가 $1, $2 등으로 표시되며, 이름 있는 그룹은 이름도 함께 나옵니다. d 플래그를 켜면 각 그룹의 시작 위치와 끝 위치도 볼 수 있습니다.
  4. 치환을 시험하려면 "일치 항목을 다음으로 치환"을 체크하고 치환할 내용을 입력하세요. 그룹은 $1이나 $<name>으로 참조합니다. 바뀐 텍스트는 "치환 결과"에 나타나며, "결과 복사"로 복사할 수 있습니다.
  5. "코드 생성기"에서 JavaScript, Python, Java, PHP, Go, C# 중 하나를 고르고 "코드 복사"를 누르세요. "일치 항목을 다음으로 치환"이 체크되어 있으면 코드에 치환도 포함됩니다. "/패턴/플래그로 복사"는 패턴을 JavaScript 정규식 리터럴로 복사합니다.

자주 묻는 질문

테스트하는 텍스트가 어딘가로 전송되나요?

아니요. 패턴과 테스트 문자열은 브라우저에 내장된 JavaScript 정규식 엔진으로 검사하며, LeedyBox로 업로드되지 않습니다. 도구가 이를 저장하지도 않습니다.

패턴이 예상보다 많은 텍스트와 일치하는 이유는 무엇인가요?

패턴은 들어맞는 곳이면 어디서든 일치하므로 \d{3}은 12345 안의 123도 찾습니다. 단어나 숫자 전체만 찾으려면 양쪽 끝에 \b를 붙이고, 텍스트 전체(m 플래그를 켜면 각 줄)가 일치해야 한다면 치트시트의 비밀번호 패턴처럼 ^와 $를 쓰세요. \b는 \w의 단어 문자(A–Z, a–z, 0–9, _)를 기준으로 하며 é나 한 같은 글자는 단어 문자가 아닌 것으로 보므로, café 뒤에 공백이 오면 \bcafé\b는 café와 일치하지 않습니다. 또한 +나 * 같은 수량자는 탐욕적(greedy)이어서, <b>x</b>에서 <.+>는 문자열 전체와 일치하지만 <.+?>나 <[^>]+>는 첫 번째 >에서 멈춥니다.

Python, PHP, Java에서 동작하는 패턴이 여기서는 왜 정규식 오류가 나나요?

이 페이지는 JavaScript 엔진을 쓰는데, 이 엔진은 다른 엔진의 일부 문법을 받아들이지 않습니다. (?P<name>…) 형식의 이름 있는 그룹, 맨 앞의 (?i) 같은 인라인 플래그, 원자 그룹 (?>…), a++ 같은 소유 수량자가 그렇습니다. 이름 있는 그룹은 (?<name>…)으로 쓰고, 인라인 플래그 대신 "플래그"의 체크박스를 사용하세요. u 플래그를 켜면 JavaScript는 이스케이프도 더 엄격하게 검사해서 \#은 오류가 되고, 대괄호 밖의 \-도 오류가 됩니다. 이럴 때는 백슬래시를 지우거나 u를 끄세요.

\p{L}이 글자와 일치하지 않거나, 이모지가 두 글자로 세어지는 이유는 무엇인가요?

\p{L} 같은 유니코드 속성 클래스에는 u 플래그가 필요합니다. u가 없으면 JavaScript는 \p{L}을 문자 그대로의 p{L}로 읽고, .은 많은 이모지처럼 기본 다국어 평면(BMP) 밖에 있는 문자의 절반과만 일치합니다. 치트시트의 패턴을 불러오면 그 패턴의 플래그도 함께 불러오는데, "특수문자"를 제외한 모든 패턴은 u가 꺼져 있으므로 이런 문법을 추가하기 전에 "플래그"를 확인하세요. u를 켜도 .은 코드 포인트 하나와 일치하며, 국기나 피부색이 적용된 엄지척 같은 일부 이모지는 코드 포인트 두 개 이상으로 이루어져 있습니다. 일치 상세의 위치는 JavaScript와 마찬가지로 UTF-16 코드 단위로 세므로, BMP 밖의 문자는 u를 켜도 두 자리를 차지합니다.

치환 내용의 \n이 줄바꿈으로 들어가지 않는 이유는 무엇인가요?

치환 내용은 JavaScript replace()의 규칙을 따르므로 $로 시작하는 문자열만 특별하게 처리됩니다. 따라서 \n과 \t는 줄바꿈이나 탭이 아니라 백슬래시와 글자 그대로 들어갑니다. 이 입력란은 한 줄짜리라 여기서는 줄바꿈을 넣을 수 없으니, 생성된 코드에서 추가하세요. 일치 항목을 지우려면 치트시트의 "HTML/XML 태그 제거" 패턴처럼 "일치 항목을 다음으로 치환"을 체크하고 입력란을 비워 두세요.

패턴이 매우 느리거나 일치 항목이 아주 많으면 어떻게 되나요?

브라우저가 Web Worker를 허용하면 일치 검사는 백그라운드 워커에서 실행되고 2초가 지나면 중단됩니다. 그래서 a가 길게 이어진 뒤 다른 문자가 오는 텍스트에 (a+)+$를 적용할 때처럼 치명적인 백트래킹(catastrophic backtracking)이 일어나는 패턴은 페이지를 멈추게 하지 않고 메시지를 표시합니다. "일치"의 개수에는 모든 일치 항목이 포함되지만, 강조 표시와 상세 목록에는 처음 1,000개만 나옵니다.

생성된 코드를 그대로 프로젝트에 붙여넣어도 되나요?

출발점으로 쓰세요. 코드 생성기는 패턴을 JavaScript에서는 정규식 리터럴로, 다른 언어에서는 문자열로 쓰고, Python의 (?P<name>…)와 \g<1>처럼 문법이 다른 경우에는 이름 있는 그룹과 치환 참조를 바꿔 쓰며, i, m, s 플래그를 각 언어에 맞게 옮기고, 입력이 text라는 변수에 있다고 가정합니다. 패턴에 따옴표나 슬래시가 들어 있으면 코드에서 제대로 이스케이프되었는지 확인하세요. 그래도 엔진마다 차이가 있습니다. Go의 regexp 패키지는 전후방 탐색과 역참조를 지원하지 않는 RE2 문법을 쓰고, Python의 표준 re 모듈은 \p{…} 클래스를 지원하지 않으므로 실제 데이터로 코드를 테스트하세요.