정규식 치트 시트 — 모든 토큰과 예제

모든 정규 표현식 토큰을 실제로 작동하는 예제와 함께, JavaScript, PCRE/PHP, Python, Go, Java, .NET 지원 여부까지 정리했습니다. 사용해 보기 링크를 누르면 정규식 테스터가 미리 채워진 상태로 열립니다.

마지막 확인: 2026-10-18, ECMAScript 2025 (MDN), PCRE2 10.45, Python 3.14 re, Go 1.27 regexp/syntax, Java 25 Pattern, .NET 정규식 레퍼런스 기준. 출처: MDN regular expressions, PCRE2 pattern syntax, Python re, Go regexp/syntax, Java Pattern, .NET regex quick reference.

항목 82개
정규식 엔진

✓ 같은 문법 · ~ 다른 문법 또는 제한적 · ✗ 지원 안 함. 예제는 JavaScript로 실행되며, 다른 언어의 문법은 참고에 나와 있습니다.

문자와 이스케이프

대부분의 문자는 그 문자 자체와 일치합니다. 다음 12개는 특별한 의미가 있어 문자 그대로 일치시키려면 백슬래시가 필요합니다: \ ^ $ . | ? * + ( ) [ { (일부 위치에서는 ] }도).

.임의의 문자#

줄바꿈을 제외한 임의의 한 문자. s(dotAll) 플래그를 추가하면 줄바꿈도 포함합니다.

/h.t/g 대상 “hat hot h t hit h↵t” 일치 “hat” “hot” “h t” “hit”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Python re: \n만 제외합니다. JavaScript는 \r, \u2028, \u2029도 제외합니다.
  • Go RE2: \n만 제외합니다.
\. \$ \(메타 문자 이스케이프#

백슬래시는 다음 특수 문자를 문자 그대로 만듭니다. \.는 실제 점, \$는 달러 기호입니다.

/\$\d+\.\d{2}/g 대상 “Total $45.00, tax $3.15, tip 5” 일치 “$45.00” “$3.15”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
\t \n \r탭, 줄바꿈, 캐리지 리턴#

이름으로 쓰는 제어 문자입니다. Windows 줄 끝은 \r\n이며, \r?\n은 두 방식 모두와 일치합니다.

/\w+\t\w+/g 대상 “name⇥age↵ana⇥31” 일치 “name⇥age” “ana⇥31”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
\xhh16진수 코드로 문자 지정#

정확히 16진수 두 자리: \x41은 A, \x20은 공백입니다.

/\x41/g 대상 “A b A” 일치 “A” “A”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
\uhhhh유니코드 코드 단위로 문자 지정#

기본 다국어 평면(BMP)의 문자를 16진수 네 자리로 지정합니다: \u00e9는 é입니다.

/\u00e9/g 대상 “café résumé” 일치 “é” “é” “é”
✓ JS 지원✗ PCRE 지원 안 함✓ Py 지원✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • PCRE / PHP: \x{e9}를 사용하세요.
  • Go RE2: \x{e9}를 사용하세요.
\u{1F600}모든 코드 포인트 (BMP 밖 포함)#

중괄호로 감싼 코드 포인트로, 이모지 등 U+FFFF보다 큰 문자에 필요합니다. JavaScript는 u 또는 v 플래그가 필요합니다.

/\u{1F600}/gu 대상 “Hi 😀 there 😀” 일치 “😀” “😀”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적✗ .NET 지원 안 함
  • PCRE / PHP: \x{1F600}으로 씁니다(PHP는 u 수정자 필요).
  • Python re: \U0001F600(16진수 여덟 자리)으로 씁니다.
  • Go RE2: \x{1F600}으로 씁니다.
  • Java: \x{1F600}으로 씁니다.
  • .NET: \uhhhh만 지원합니다. 이모지는 UTF-16 코드 단위 두 개입니다(예: \uD83D\uDE00).

문자 클래스

클래스는 집합에 속한 문자 정확히 하나와 일치합니다. [ ] 안에서는 대부분의 메타 문자가 의미를 잃으며, ] \ ^ -만 주의하면 됩니다.

[abc]다음 중 하나#

목록에 있는 문자 하나.

/gr[ae]y/g 대상 “gray grey groy” 일치 “gray” “grey”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
[^abc]다음 중 어느 것도 아님#

목록에 없는 문자 하나(맨 앞이 아닌 곳의 ^는 문자 그대로). 줄바꿈과도 일치합니다.

/[^aeiou\s]/g 대상 “regex” 일치 “r” “g” “x”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
[a-z]범위#

두 코드 포인트 사이의 문자. 범위를 조합할 수 있으며 [A-Fa-f0-9]는 16진수 숫자입니다. 맨 앞이나 맨 뒤의 -는 문자 그대로입니다.

/[A-Fa-f0-9]+/g 대상 “x: 3fA9 zz” 일치 “3fA9”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
\d \D숫자 / 숫자 아님#

\d는 숫자, \D는 그 외 모든 문자입니다.

/\d+/g 대상 “Order 66, room 101” 일치 “66” “101”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Python re: str 패턴에서 \d는 모든 유니코드 숫자(예: ٣)와 일치합니다. 0-9만 원하면 re.ASCII를 쓰세요.
  • .NET: RegexOptions.ECMAScript를 설정하지 않으면 모든 유니코드 숫자와 일치합니다.
\w \W단어 문자 / 단어 문자 아님#

영문자, 숫자, 밑줄. JavaScript와 Go에서는 ASCII만 해당하므로 \w는 é와 일치하지 않습니다.

/\w+/g 대상 “snake_case and kebab-case” 일치 “snake_case” “and” “kebab” “case”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • PCRE / PHP: PCRE2_UCP가 아니면 ASCII만(PHP: u 수정자와 (*UCP)).
  • Python re: str 패턴에서는 기본적으로 유니코드 문자와 숫자.
  • Java: U 플래그(UNICODE_CHARACTER_CLASS)를 켜지 않으면 ASCII만.
  • .NET: 유니코드 문자, 숫자, 연결 문장 부호.
\s \S공백 / 공백 아님#

스페이스, 탭, 줄바꿈 그리고 (대부분의 엔진에서) 기타 유니코드 공백.

/\s+/g 대상 “a b⇥c” 일치 “ ” “⇥”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Go RE2: ASCII 공백만: \t \n \f \r, 스페이스.
[[:alpha:]]POSIX 대괄호 클래스#

대괄호 안에서 쓰는 [:alpha:], [:digit:], [:space:], [:punct:] 같은 이름 있는 클래스.

문법 (JavaScript 제외): [[:alpha:]]+
✗ JS 지원 안 함✓ PCRE 지원✗ Py 지원 안 함✓ Go 지원~ Java 다른 문법 / 제한적✗ .NET 지원 안 함
  • JavaScript: [A-Za-z] 또는 u 플래그와 함께 \p{L}을 쓰세요.
  • Java: \p{Alpha}, \p{Digit}, \p{Punct}를 쓰세요.
[\p{L}--[a-z]]클래스 차집합 / 교집합#

클래스 안의 집합 연산. JavaScript는 v 플래그(ES2024)가 필요하며, --는 차집합, &&는 교집합입니다.

/[\p{L}--[a-z]]+/gv 대상 “abcÉtéXYZ” 일치 “É” “éXYZ”
✓ JS 지원~ PCRE 다른 문법 / 제한적✗ Py 지원 안 함✗ Go 지원 안 함~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: PCRE2 10.45 이상에서만, (?[ … ]) 확장 클래스 문법으로.
  • Java: 교집합은 [a-z&&[^aeiou]]이며, 차집합은 부정 클래스와의 교집합으로 씁니다.
  • .NET: 차집합은 [a-z-[aeiou]]이며, 교집합은 없습니다.

앵커와 경계

앵커는 문자가 아니라 위치와 일치하므로 텍스트를 소비하지 않습니다.

^ $문자열의 시작 / 끝 (m이면 줄)#

m 플래그가 없으면 ^와 $는 입력 전체의 시작과 끝이고, 있으면 각 줄의 시작과 끝입니다.

/^\w+/gm 대상 “first line↵second line” 일치 “first” “second”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • PCRE / PHP: $는 마지막 \n 앞에서도 일치합니다.
  • Python re: $는 마지막 \n 앞에서도 일치합니다.
  • Java: $는 마지막 줄 종결자 앞에서도 일치합니다.
  • .NET: $는 마지막 \n 앞에서도 일치합니다.
\b단어 경계#

단어 문자와 단어가 아닌 문자 사이(또는 입력의 가장자리). 단어 전체를 일치시킬 때 씁니다.

/\bcat\b/g 대상 “cat concat cats cat.” 일치 “cat” “cat”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • JavaScript: u 플래그를 써도 ASCII 단어 문자만 해당합니다.
  • Go RE2: ASCII 단어 문자만 해당합니다.
\B단어 경계 아님#

단어 내부. 예를 들어 "cat"이 더 긴 단어의 일부일 때만 일치합니다.

/\Bcat/g 대상 “concat cat bobcat” 일치 “cat” “cat”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
\A \z \Z절대 시작 / 끝#

여러 줄 모드와 관계없이 입력의 시작과 끝. \Z는 마지막 줄바꿈도 허용합니다(Python에서는 \z와 같은 의미).

문법 (JavaScript 제외): \A\d+\z
✗ JS 지원 안 함✓ PCRE 지원~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적✓ Java 지원✓ .NET 지원
  • JavaScript: m 플래그 없이 ^와 $를 쓰세요.
  • Python re: \A와 \z(3.14 이상). \Z는 다른 엔진의 \z처럼 절대 끝을 뜻합니다.
  • Go RE2: \A와 \z. \Z는 없습니다.
\G이전 일치의 끝#

마지막 일치가 끝난 위치. 연속된 구간을 일치시킬 때 씁니다.

문법 (JavaScript 제외): \G\d
~ JS 다른 문법 / 제한적✓ PCRE 지원✗ Py 지원 안 함✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • JavaScript: \G는 없습니다. y(sticky) 플래그로 "정확히 여기서 시작"하는 같은 동작을 얻을 수 있습니다.

수량자: 탐욕적, 게으른, 소유적

수량자는 앞의 항목을 반복합니다. 탐욕적(기본값) 수량자는 최대한 많이 가져간 뒤 물러서고, 게으른 수량자(? 추가)는 최대한 적게 가져가며, 소유적 수량자(+ 추가)는 절대 물러서지 않습니다.

*0회 이상#

0회부터 무제한 반복.

/ba*/g 대상 “b ba baaa” 일치 “b” “ba” “baaa”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
+1회 이상#

1회부터 무제한 반복.

/lo+l/g 대상 “lol loool ll” 일치 “lol” “loool”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
?선택적#

0회 또는 1회.

/colou?r/g 대상 “color colour colouur” 일치 “color” “colour”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
{n}정확히 n회#

정확히 n번 반복.

/\d{3}/g 대상 “12 345 6789” 일치 “345” “678”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
{n,}n회 이상#

최소 n번 반복.

/\d{2,}/g 대상 “1 22 333” 일치 “22” “333”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
{n,m}n회에서 m회#

n번에서 m번까지, 가능한 한 많이 반복.

/\d{2,3}/g 대상 “1 22 4444” 일치 “22” “444”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Go RE2: 1000보다 큰 횟수는 거부됩니다.
{,m}최대 m회#

0번에서 m번 반복. 일부 엔진만 지원하며, 다른 엔진에서는 문자 그대로의 "{,m}"이 되거나 오류가 납니다. {0,m}은 어디서나 작동합니다.

문법 (JavaScript 제외): \d{,3}
✗ JS 지원 안 함~ PCRE 다른 문법 / 제한적✓ Py 지원✗ Go 지원 안 함✗ Java 지원 안 함✗ .NET 지원 안 함
  • JavaScript: u 없이는 문자 그대로, u가 있으면 문법 오류입니다. {0,3}으로 쓰세요.
  • PCRE / PHP: PCRE2 10.43 이상에서만.
  • Go RE2: {0,3}으로 쓰세요.
  • Java: {0,3}으로 쓰세요.
  • .NET: 문자 그대로 처리됩니다. {0,3}으로 쓰세요.
.* .+탐욕적 (기본값)#

가능한 가장 긴 일치를 가져간 뒤, 나머지가 맞을 때까지 문자를 돌려줍니다. 이 예에서는 두 태그를 모두 삼킵니다.

/<.+>/g 대상 “<b>bold</b>” 일치 “<b>bold</b>”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
*? +? ?? {n,m}?게으른 (비탐욕적)#

가능한 가장 짧은 일치를 가져갑니다. 패턴이 "너무 많이 일치"할 때 보통 이것으로 해결합니다.

/<.+?>/g 대상 “<b>bold</b>” 일치 “<b>” “</b>”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Go RE2: 탐욕적과 게으른 동작을 맞바꾸는 U 플래그로도 사용할 수 있습니다.
*+ ++ ?+소유적#

백트래킹 없는 탐욕적 수량자로, 한 번 일치한 문자는 돌려주지 않습니다. 실패가 빨라지고 치명적 백트래킹을 막아 줍니다.

문법 (JavaScript 제외): "[^"]*+"
✗ JS 지원 안 함✓ PCRE 지원~ Py 다른 문법 / 제한적✗ Go 지원 안 함✓ Java 지원✗ .NET 지원 안 함
  • JavaScript: 소유적 수량자와 원자 그룹이 없습니다. (?=(…))\1로 흉내 내세요.
  • Python re: Python 3.11 이상.
  • Go RE2: 필요 없음: RE2는 백트래킹을 하지 않습니다.
  • .NET: 원자 그룹 (?>…)을 쓰세요.

그룹과 역참조

괄호는 수량자와 대체(|)를 위해 항목을 묶고, (비캡처로 지정하지 않으면) 일치한 내용을 저장합니다.

( … )캡처 그룹#

묶고 캡처합니다. 여는 괄호 순서대로 1부터 번호가 매겨집니다.

/(\d{3})-(\d{4})/g 대상 “Call 555-0199 or 555-0123” 일치 “555-0199” “555-0123”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
(?: … )비캡처 그룹#

저장하지 않고 묶기만 하므로 그룹 번호가 바뀌지 않고 일치 처리 비용도 조금 줄어듭니다.

/(?:ab)+/g 대상 “ababab ab a” 일치 “ababab” “ab”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
(?<name> … )명명된 그룹#

나중에 읽을 수 있는 이름으로 캡처합니다(JavaScript에서는 match.groups.name).

/(?<year>\d{4})-(?<month>\d{2})/g 대상 “Released 2026-10” 일치 “2026-10”
✓ JS 지원✓ PCRE 지원~ Py 다른 문법 / 제한적✓ Go 지원✓ Java 지원✓ .NET 지원
  • PCRE / PHP: (?'name'…)과 (?P<name>…)도 지원.
  • Python re: (?P<name>…)만 지원.
  • Go RE2: (?P<name>…). Go 1.22부터는 (?<name>…)도 허용.
  • .NET: (?'name'…)도 지원.
\1번호로 역참조#

앞에서 그룹이 캡처한 것과 같은 텍스트와 일치합니다.

/(\w)\1/g 대상 “bookkeeper” 일치 “oo” “kk” “ee”
✓ JS 지원✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • Go RE2: RE2에는 역참조가 없습니다(선형 시간 보장이 깨지기 때문).
\k<name>이름으로 역참조#

\1과 같지만 이름을 씁니다. 예제는 짝이 맞는 따옴표 안의 텍스트와 일치합니다.

/(?<q>['"]).*?\k<q>/g 대상 “say "hi" or 'yo'” 일치 “"hi"” “'yo'”
✓ JS 지원✓ PCRE 지원~ Py 다른 문법 / 제한적✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • PCRE / PHP: \k{name}, \g{name}, (?P=name)도 지원.
  • Python re: (?P=name)으로 씁니다.
a|b대체 (또는)#

양쪽 중 하나. 대체 항목은 왼쪽부터 시도하므로, 한 항목이 다른 항목의 접두사라면 긴 것을 앞에 두세요.

/cat|dog/g 대상 “hotdog catalog” 일치 “dog” “cat”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
(?> … )원자 그룹#

그룹이 한 번 일치하면 엔진이 그 안으로 다시 백트래킹하지 않습니다.

문법 (JavaScript 제외): (?>a|ab)c
✗ JS 지원 안 함✓ PCRE 지원~ Py 다른 문법 / 제한적✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • Python re: Python 3.11 이상.
  • Go RE2: 필요 없음: RE2는 백트래킹을 하지 않습니다.
(?i) (?i: … )인라인 플래그#

패턴 안에서 플래그를 켜거나 끕니다. (?i)는 패턴의 나머지 전체에, (?i:…)는 그 그룹에만 적용되며, (?-i:…)는 플래그를 끕니다.

/(?i:hello) world/g 대상 “HELLO world HELLO WORLD” 일치 “HELLO world”
~ JS 다른 문법 / 제한적✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • JavaScript: 범위 지정 형식 (?i:…) / (?-i:…)만, i, m, s에 대해 지원합니다(ES2025). 시작 부분의 (?i)는 문법 오류입니다.
  • Python re: 전역 (?i)는 패턴 맨 앞에 있어야 합니다(3.11부터 다른 위치는 오류). (?i:…)는 어디서나 작동합니다.
(?(1)yes|no)조건문#

그룹 1이 일치에 참여했으면 "yes", 아니면 "no"와 일치합니다.

문법 (JavaScript 제외): (<)?\w+(?(1)>)
✗ JS 지원 안 함✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✗ Java 지원 안 함✓ .NET 지원
(?R) (?1)재귀 / 서브루틴#

패턴 전체나 그룹에 다시 들어가며, 짝이 맞는 괄호처럼 중첩된 구조에 씁니다.

문법 (JavaScript 제외): \((?:[^()]|(?R))*\)
✗ JS 지원 안 함✓ PCRE 지원✗ Py 지원 안 함✗ Go 지원 안 함✗ Java 지원 안 함~ .NET 다른 문법 / 제한적
  • Python re: 서드파티 regex 모듈에서 사용할 수 있습니다.
  • .NET: 재귀는 없으며, 밸런싱 그룹 (?<open-close>…)으로 중첩을 처리합니다.
(?# … )인라인 주석#

엔진이 무시합니다. 긴 주석은 x(확장) 플래그를 쓰세요.

문법 (JavaScript 제외): \d{3}(?#area code)
✗ JS 지원 안 함✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✗ Java 지원 안 함✓ .NET 지원

전방 탐색과 후방 탐색

전후방 탐색은 현재 위치 옆에 무엇이 있는지 확인하되 일치 결과에는 포함하지 않습니다. 앵커처럼 폭이 0입니다.

(?= … )긍정 전방 탐색#

뒤에 …가 옴(일치 결과에 포함 안 됨).

/\d+(?=px)/g 대상 “10px 20em 30px” 일치 “10” “30”
✓ JS 지원✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • Go RE2: RE2에는 어떤 종류의 전후방 탐색도 없습니다.
(?! … )부정 전방 탐색#

뒤에 …가 오지 않음. 안쪽의 \d는 검사를 통과하려고 엔진이 숫자를 돌려주는 것을 막습니다.

/\d+(?!px|\d)/g 대상 “10px 20em” 일치 “20”
✓ JS 지원✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
(?<= … )긍정 후방 탐색#

앞에 …가 있음(일치 결과에 포함 안 됨).

/(?<=\$)\d+(?:\.\d\d)?/g 대상 “Cost: $42.50 or 42” 일치 “42.50”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적✗ Go 지원 안 함~ Java 다른 문법 / 제한적✓ .NET 지원
  • JavaScript: 길이 제한 없음(ES2018).
  • PCRE / PHP: 각 대체 항목의 길이가 제한되어야 합니다. PCRE2 10.43부터 가변 길이(기본 최대 255) 지원.
  • Python re: 고정 길이만: (?<=ab|cd)는 되지만 (?<=a+)는 오류입니다.
  • Java: 제한된 길이만: 안에 *나 +를 쓸 수 없습니다.
  • .NET: 길이 제한 없음.
(?<! … )부정 후방 탐색#

앞에 …가 없음.

/(?<!\$)\b\d+\b/g 대상 “$30 and 45” 일치 “45”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적✗ Go 지원 안 함~ Java 다른 문법 / 제한적✓ .NET 지원
  • PCRE / PHP: 긍정 후방 탐색과 같은 길이 규칙.
  • Python re: 고정 길이만.
  • Java: 제한된 길이만.
\K일치 시작 위치 재설정#

지금까지 일치한 내용을 결과에서 버립니다. 길이 제한 없는 후방 탐색과 같습니다.

문법 (JavaScript 제외): price: \K\d+
✗ JS 지원 안 함✓ PCRE 지원✗ Py 지원 안 함✗ Go 지원 안 함✗ Java 지원 안 함✗ .NET 지원 안 함
  • JavaScript: (?<=…)나 캡처 그룹을 쓰세요.

플래그 (수정자)

JavaScript는 닫는 슬래시 뒤에 플래그를 씁니다(/x/gi). 다른 언어는 상수(re.I, Pattern.CASE_INSENSITIVE, RegexOptions.IgnoreCase)를 넘기거나 인라인 (?i)를 씁니다.

g전역 (모든 일치)#

첫 번째 일치에서 멈추지 않고 모든 일치를 찾습니다. matchAll과 replaceAll에 필요합니다.

/o/g 대상 “foo boo” 일치 “o” “o” “o” “o”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: 플래그 없음: preg_match_all() / preg_replace()를 쓰세요.
  • Python re: 플래그 없음: re.findall(), re.finditer(), re.sub()를 쓰세요.
  • Go RE2: 플래그 없음: FindAll… 메서드를 쓰세요.
  • Java: 플래그 없음: matcher.find()로 반복하세요.
  • .NET: 플래그 없음: Regex.Matches()를 쓰세요.
i대소문자 무시#

대소문자를 구분하지 않고 일치시킵니다.

/hello/gi 대상 “Hello HELLO hello” 일치 “Hello” “HELLO” “hello”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Python re: re.I / re.IGNORECASE 또는 (?i).
  • Java: CASE_INSENSITIVE(UNICODE_CASE가 아니면 ASCII만) 또는 (?i).
  • .NET: RegexOptions.IgnoreCase 또는 (?i).
m여러 줄#

^와 $가 입력의 양 끝뿐 아니라 각 줄의 시작과 끝에서도 일치합니다.

/^-\s.+$/gm 대상 “- one↵- two↵three” 일치 “- one” “- two”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Python re: re.M / re.MULTILINE.
  • .NET: RegexOptions.Multiline.
s점이 줄바꿈과 일치#

.가 줄바꿈과도 일치하게 합니다. 이 플래그 없이 "모든 문자"를 쓰려면 호환성 좋은 [\s\S]를 쓰세요.

/<p>.*?</p>/gs 대상 “<p>a↵b</p>” 일치 “<p>a↵b</p>”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
  • Python re: re.S / re.DOTALL.
  • Java: Pattern.DOTALL.
  • .NET: 이름은 RegexOptions.Singleline.
x확장 (자유 공백)#

패턴 안의 공백은 무시되고 #은 주석을 시작하므로 긴 패턴을 여러 줄에 나눠 쓸 수 있습니다.

문법 (JavaScript 제외): (?x) \d{3} - \d{4} # local number
✗ JS 지원 안 함✓ PCRE 지원✓ Py 지원✗ Go 지원 안 함✓ Java 지원✓ .NET 지원
  • Python re: re.X / re.VERBOSE.
  • Java: Pattern.COMMENTS.
  • .NET: RegexOptions.IgnorePatternWhitespace.
u유니코드#

입력을 코드 포인트 단위로 다루고(그래서 .가 이모지 하나 전체와 일치), \p{…}와 \u{…}를 활성화하며, 잘못된 이스케이프를 오류로 처리합니다.

/^.$/gu 대상 “😀” 일치 “😀”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: PHP u 수정자(UTF-8 모드). 유니코드 \w와 \d를 쓰려면 (*UCP)를 추가하세요.
  • Python re: 플래그 필요 없음: str 패턴은 유니코드이며 re.ASCII로 끌 수 있습니다.
  • Go RE2: 플래그 없음: Go는 항상 UTF-8 코드 포인트 단위로 동작합니다.
  • Java: UNICODE_CASE와 UNICODE_CHARACTER_CLASS (U).
  • .NET: 플래그 없음: 항상 UTF-16 코드 단위입니다(이모지는 두 개).
v유니코드 집합#

u를 개선한 ES2024 플래그로, 클래스 집합 연산(--, &&), 중첩 클래스, \p{RGI_Emoji} 같은 문자열 속성을 지원합니다. u와 함께 쓸 수 없습니다.

/[\p{L}&&\p{ASCII}]+/gv 대상 “Ünïcode text” 일치 “n” “code” “text”
✓ JS 지원✗ PCRE 지원 안 함✗ Py 지원 안 함✗ Go 지원 안 함✗ Java 지원 안 함✗ .NET 지원 안 함
ySticky#

각 일치는 이전 일치가 끝난 위치(lastIndex)에서 정확히 시작해야 합니다. 토크나이저에 유용합니다.

/\d/gy 대상 “12a3” 일치 “1” “2”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적✗ Go 지원 안 함~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: \G를 쓰세요.
  • Python re: pattern.match(text, pos)를 쓰세요.
  • Java: \G나 matcher.lookingAt()을 쓰세요.
  • .NET: \G를 쓰세요.
d일치 인덱스#

모든 캡처 그룹의 시작과 끝을 담은 match.indices를 추가합니다(ES2022).

문법 (JavaScript 제외): /(?<y>\d{4})/d
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: 오프셋을 항상 얻을 수 있음(PREG_OFFSET_CAPTURE).
  • Python re: 항상 사용 가능: m.span(n).
  • Go RE2: 항상 사용 가능: FindStringSubmatchIndex.
  • Java: 항상 사용 가능: matcher.start(n) / end(n).
  • .NET: 항상 사용 가능: Group.Index / Length.

유니코드 속성 \p{…}

속성 이스케이프는 유니코드 범주나 문자 체계(스크립트)로 문자를 일치시키며, 여러 언어에서 "모든 문자"를 확실하게 일치시키는 유일한 방법입니다. JavaScript에서는 u 또는 v 플래그가 필요합니다.

\p{L}모든 문자#

모든 문자 체계의 글자: é, ß, 東, д.

/\p{L}+/gu 대상 “naïve café 東京 123” 일치 “naïve” “café” “東京”
✓ JS 지원✓ PCRE 지원✗ Py 지원 안 함✓ Go 지원✓ Java 지원✓ .NET 지원
  • PCRE / PHP: PHP는 UTF-8 입력에 u 수정자가 필요합니다.
  • Python re: 서드파티 regex 모듈을 쓰거나, "문자"에 [^\W\d_]를 쓰세요.
\p{Lu} \p{Ll}대문자 / 소문자#

일반 범주: Lu 대문자, Ll 소문자, N 숫자, P 문장 부호, S 기호, Z 구분자.

/\p{Lu}/gu 대상 “Élan Vital” 일치 “É” “V”
✓ JS 지원✓ PCRE 지원✗ Py 지원 안 함✓ Go 지원✓ Java 지원✓ .NET 지원
\P{…}속성에 해당하지 않음#

대문자 P는 부정입니다. \P{L}은 문자가 아닌 모든 것입니다.

/\P{L}+/gu 대상 “abc-123” 일치 “-123”
✓ JS 지원✓ PCRE 지원✗ Py 지원 안 함✓ Go 지원✓ Java 지원✓ .NET 지원
\pL한 글자 축약형#

중괄호 없이 쓰는 한 글자 범주.

문법 (JavaScript 제외): \pL+
✗ JS 지원 안 함✓ PCRE 지원✗ Py 지원 안 함✓ Go 지원✓ Java 지원✗ .NET 지원 안 함
  • JavaScript: 중괄호가 필요합니다: \p{L}.
  • .NET: 중괄호가 필요합니다: \p{L}.
\p{Script=Greek}문자 체계 (스크립트)#

하나의 문자 체계에 속한 문자. sc=는 축약형이며, Script_Extensions(scx=)는 여러 문자 체계가 공유하는 문자도 포함합니다.

/\p{Script=Greek}+/gu 대상 “alpha α, beta β” 일치 “α” “β”
✓ JS 지원~ PCRE 다른 문법 / 제한적✗ Py 지원 안 함~ Go 다른 문법 / 제한적✓ Java 지원✗ .NET 지원 안 함
  • PCRE / PHP: \p{Greek}, \p{sc:Greek} 또는 \p{scx:Greek}.
  • Go RE2: \p{Greek}.
  • Java: \p{script=Greek}, \p{sc=Greek} 또는 \p{IsGreek}으로 씁니다.
  • .NET: \p{IsGreek} 같은 명명된 블록만(문자 체계가 아니라 코드 범위).
\p{sc=Han}한자 (중국어 / 일본어)#

한자 표의 문자. 일본어 가나는 \p{sc=Hiragana}와 \p{sc=Katakana}를 추가하세요.

/\p{sc=Han}+/gu 대상 “Tokyo 東京 2026 中文” 일치 “東京” “中文”
✓ JS 지원~ PCRE 다른 문법 / 제한적✗ Py 지원 안 함~ Go 다른 문법 / 제한적✓ Java 지원~ .NET 다른 문법 / 제한적
  • PCRE / PHP: \p{Han}.
  • Python re: [\u4e00-\u9fff] 같은 범위를 쓰세요(주 블록만 해당).
  • Go RE2: \p{Han}.
  • Java: \p{IsHan}도 지원.
  • .NET: 블록만 지원(예: \p{IsCJKUnifiedIdeographs}).
\p{RGI_Emoji}이모지 (시퀀스 전체)#

v 플래그를 쓰면 피부색과 가족 시퀀스를 포함한 이모지 전체와 일치합니다. u를 쓰면 \p{Extended_Pictographic}은 개별 그림 문자와만 일치합니다.

/\p{RGI_Emoji}/gv 대상 “Go 👍🏽 team 👨‍👩‍👧!” 일치 “👍🏽” “👨‍👩‍👧”
✓ JS 지원~ PCRE 다른 문법 / 제한적✗ Py 지원 안 함✗ Go 지원 안 함~ Java 다른 문법 / 제한적✗ .NET 지원 안 함
  • PCRE / PHP: 최신 PCRE2(10.40 이상)에서는 불리언 속성으로 개별 코드 포인트만. 시퀀스 속성은 없습니다.
  • Java: \p{IsEmoji}는 개별 코드 포인트와 일치합니다(Java 21 이상).
\X자소 클러스터#

사용자가 한 글자로 인식하는 단위. 예: e + 결합 악센트, 국기 이모지.

문법 (JavaScript 제외): \X
✗ JS 지원 안 함✓ PCRE 지원✗ Py 지원 안 함✗ Go 지원 안 함✓ Java 지원✗ .NET 지원 안 함
  • JavaScript: 자소 단위로 나누려면 Intl.Segmenter를 쓰세요.
  • Python re: regex 모듈에서 사용할 수 있습니다.

치환 (바꾸기) 문법

바꿀 문자열에 입력하는 내용입니다. 언어별 차이가 가장 큰 부분이므로 JavaScript 예제보다 사용하는 언어의 열이 더 중요합니다.

$&일치 전체#

일치한 텍스트 전체를 넣습니다.

/\d+/g 대상 “3 apples, 12 pears” 바꿀 내용 “[$&]” → “[3] apples, [12] pears”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적✓ .NET 지원
  • PCRE / PHP: preg_replace에서는 $0 또는 \0.
  • Python re: \g<0>.
  • Go RE2: ${0} 또는 $0 (Expand / ReplaceAllString).
  • Java: $0.
  • .NET: $0도 지원.
$1번호 그룹#

그룹 1이 캡처한 내용을 넣습니다. 두 단어 맞바꾸기:

/(\w+)\s(\w+)/g 대상 “hello world” 바꿀 내용 “$2 $1” → “world hello”
✓ JS 지원✓ PCRE 지원~ Py 다른 문법 / 제한적✓ Go 지원✓ Java 지원✓ .NET 지원
  • PCRE / PHP: \1과 ${1}도 지원.
  • Python re: \1 또는 \g<1> (raw 문자열 r"\1" 사용).
  • Go RE2: 뒤에 문자나 숫자가 오면 ${1}x로 쓰세요. 아니면 Go는 $1x를 "1x"라는 이름의 그룹으로 읽습니다.
$<name>명명된 그룹#

명명된 그룹을 넣습니다. ISO 날짜를 일/월/연도로 바꾸기:

/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/g 대상 “2026-10-18” 바꿀 내용 “$<d>/$<m>/$<y>” → “18/10/2026”
✓ JS 지원✗ PCRE 지원 안 함~ Py 다른 문법 / 제한적~ Go 다른 문법 / 제한적~ Java 다른 문법 / 제한적~ .NET 다른 문법 / 제한적
  • PCRE / PHP: preg_replace에는 이름 참조가 없습니다. 그룹 번호나 preg_replace_callback()을 쓰세요.
  • Python re: \g<name>.
  • Go RE2: ${name} (또는 $name).
  • Java: ${name}.
  • .NET: ${name}.
$$달러 기호 그대로#

바꿀 문자열에서 $를 이스케이프합니다.

/(\d+)/g 대상 “Price: 20” 바꿀 내용 “$$$1” → “Price: $20”
✓ JS 지원~ PCRE 다른 문법 / 제한적~ Py 다른 문법 / 제한적✓ Go 지원~ Java 다른 문법 / 제한적✓ .NET 지원
  • PCRE / PHP: 뒤에 숫자나 {가 오지 않는 $는 이미 문자 그대로입니다. 그 뒤에는 ${1}로 쓰세요.
  • Python re: $는 특수 문자가 아닙니다. 백슬래시는 \\로 이스케이프하세요.
  • Java: \$ (Matcher.quoteReplacement()는 문자열 전체를 이스케이프합니다).
$` $'일치 앞 / 뒤의 텍스트#

일치 앞이나 뒤의 입력을 넣습니다. 거의 쓰이지 않지만 가끔 편리합니다.

/=/ 대상 “key=value” 바꿀 내용 “ is set ($') and was ($`) ” → “key is set (value) and was (key) value”
✓ JS 지원✗ PCRE 지원 안 함✗ Py 지원 안 함✗ Go 지원 안 함✗ Java 지원 안 함✓ .NET 지원

자주 쓰는 패턴 (한계도 솔직하게)

사람들이 가장 많이 찾는 패턴을 읽기 쉽고 치명적 백트래킹에 안전하게 작성했습니다. 각 패턴이 무엇을 하지 않는지도 적었습니다.

Email (practical)이메일 형태의 문자열 찾기#

로컬 부분, @, 점이 하나 이상 있는 도메인.

/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g 대상 “Write to ana.lee+news@example.co.uk or bob@test.dev.” 일치 “ana.lee+news@example.co.uk” “bob@test.dev”

주의: 드물지만 유효한 주소(따옴표로 감싼 로컬 부분, 비ASCII 도메인)는 거부하고 일부 잘못된 주소(a..b@x.y)는 허용합니다. 메일함이 실제로 있는지는 어떤 정규식으로도 알 수 없으니 확인 이메일을 보내세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
URL텍스트에서 http(s) 링크 찾기#

공백, 따옴표, 꺾쇠괄호에서 멈추고 마침표나 쉼표 같은 끝의 문장 부호는 제외합니다.

/https?://[^\s<>"]*[^\s<>".,;:!?)]/g 대상 “See https://example.com/a?b=1, or (http://test.dev/x).” 일치 “https://example.com/a?b=1” “http://test.dev/x”

주의: 텍스트를 링크로 바꿀 때는 좋지만 유효성 검사용은 아닙니다. URL을 검사하려면 언어의 URL 파서(JavaScript의 new URL())를 쓰고 프로토콜과 호스트를 확인하세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
IPv4 address0–255 옥텟 4개#

각 옥텟을 앞자리 0 없이 0–255로 제한합니다.

/\b(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}\b/g 대상 “10.0.0.1 256.1.1.1 192.168.1.254” 일치 “10.0.0.1” “192.168.1.254”

주의: IPv6, CIDR 접미사, 포트는 처리하지 않습니다. 유효성 검사에는 IP 파서(Python ipaddress, Go net/netip, Node net.isIP)를 쓰세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Date YYYY-MM-DDISO 8601 날짜#

월은 01–12, 일은 01–31.

/\b\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\b/g 대상 “2026-10-18, 2026-13-01, 2026-02-31” 일치 “2026-10-18” “2026-02-31”

주의: 형태만 검사하므로 2026-02-31도 통과합니다. 존재하지 않는 날짜를 거르려면 날짜 라이브러리로 파싱하세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Date MM/DD/YYYY미국식 날짜#

한두 자리 월과 일, 네 자리 연도.

/\b(?:0?[1-9]|1[0-2])/(?:0?[1-9]|[12]\d|3[01])/\d{4}\b/g 대상 “Due 10/18/2026 or 1/5/2027, not 13/01/2026” 일치 “10/18/2026” “1/5/2027”

주의: 01/02/2026은 미국에서는 1월 2일이지만 그 밖의 거의 모든 곳에서는 2월 1일입니다. 정규식으로는 어느 쪽인지 알 수 없습니다.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Phone (North America)(416) 555-0199 및 변형#

괄호, 공백, 점, 대시를 선택적으로 포함한 10자리 숫자.

/\(?\b\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g 대상 “(416) 555-0199, 416.555.0199, 4165550199” 일치 “(416) 555-0199” “416.555.0199” “4165550199”

주의: 북미 번호 전용입니다. 국제 번호에는 libphonenumber 같은 라이브러리를 쓰고, 번호는 E.164 형식(다음 행)으로 저장하세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Phone (E.164)국제 형식 +CC…#

더하기 기호, 0으로 시작하지 않는 국가 코드, 총 15자리 이하.

/^\+[1-9]\d{1,14}$/gm 대상 “+14165550199↵+447911123456↵0044791112” 일치 “+14165550199” “+447911123456”

주의: E.164 형태만 검사하며, 실제 할당된 번호인지나 해당 국가에 맞는 길이인지는 확인하지 않습니다.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Hex colour#rgb, #rgba, #rrggbb, #rrggbbaa#

CSS가 허용하는 네 가지 길이.

/#(?:[\da-fA-F]{8}|[\da-fA-F]{6}|[\da-fA-F]{3,4})\b/g 대상 “#fff #244b3f #12345 #ff000080 #1234567” 일치 “#fff” “#244b3f” “#ff000080”

주의: #프래그먼트가 있는 URL처럼 긴 텍스트 안에서도 일치합니다. 값 하나를 검사하려면 ^…$로 고정하세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
URL sluglowercase-words-with-hyphens#

하이픈 하나로 구분된 소문자와 숫자.

/^[a-z0-9]+(?:-[a-z0-9]+)*$/gm 대상 “my-post-2026↵My Post↵-bad-↵good” 일치 “my-post-2026” “good”

주의: ASCII만 해당합니다. 제목으로 슬러그를 만들려면 정규식 대신 URL 슬러그 생성기를 쓰세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Trim whitespace앞뒤 공백#

빈 문자열로 바꿉니다. m 플래그가 없으면 ^와 $는 텍스트 전체의 양 끝입니다.

/^\s+|\s+$/g 대상 “ padded text ” 바꿀 내용 “” → “padded text”

주의: 모든 최신 언어에는 더 빠르고 명확한 내장 trim()이 있습니다. 코드를 호출할 수 없는 곳(편집기, 설정 파일)에서만 정규식을 쓰세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Collapse spaces연속 공백을 하나로#

두 개 이상의 공백이나 탭을 공백 하나로 바꿉니다.

/[ \t]{2,}/g 대상 “too many ⇥ spaces” 바꿀 내용 “ ” → “too many spaces”
✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Duplicate wordsthe the, is is#

같은 단어가 연달아 나오는 경우. i를 쓰면 "The the"도 찾습니다.

/\b(\w+)\s+\1\b/gi 대상 “This is is a test test of The the editor” 일치 “is is” “test test” “The the”

주의: 역참조가 필요해서 Go에서는 작동하지 않습니다. "had had"와 "that that"은 올바른 영어일 때도 있습니다.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Password rules소문자, 대문자, 숫자, 12자 이상#

각 전방 탐색이 처음부터 규칙 하나씩을 검사하고, .{12,}가 길이를 지정합니다.

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$/gm 대상 “short1A↵alllowercase123↵GoodPassword42” 일치 “GoodPassword42”

주의: NIST SP 800-63B는 문자 조합 규칙을 권장하지 않습니다. 대신 길이를 요구하고 유출된 비밀번호 목록과 대조하세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
UUID8-4-4-4-12 16진수#

RFC 9562 변형 비트를 가진 버전 1–8.

/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi 대상 “id 3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b and 00000000-0000-0000-0000-000000000000” 일치 “3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b”

주의: 유효한 특수 값인 nil UUID(모두 0)와 max UUID(모두 f)는 거부합니다.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원
Strip HTML tags<태그> 제거#

빈 문자열로 바꾸면 대략적인 일반 텍스트를 얻을 수 있습니다.

/<[^>]+>/g 대상 “<p>Hello <b>world</b></p>” 바꿀 내용 “” → “Hello world”

주의: 속성, 주석, 스크립트 안의 >에서 깨지고 &amp; 같은 엔티티를 디코딩하지 않습니다. 신뢰할 수 없는 HTML을 정제하는 데는 절대 쓰지 말고 DOMParser나 DOMPurify 같은 새니타이저를 쓰세요.

✓ JS 지원✓ PCRE 지원✓ Py 지원✓ Go 지원✓ Java 지원✓ .NET 지원

정적인 레퍼런스입니다. 검색과 필터는 브라우저에서 처리되며, ‘사용해 보기’ 링크는 브라우저에서 실행되는 정규식 테스터를 엽니다. 모든 무료 도구 보기.

문제를 발견하셨거나 개선할 점이 있나요? 모든 메시지를 읽고 빠르게 고칩니다.

이 정규식 치트 시트는 \d와 \b부터 후방 탐색, 소유 수량자, \p{Script=Greek}까지 필요할 만한 모든 정규 표현식 토큰을 짧은 설명과 함께, 정확히 무엇과 일치하는지 보여 주는 예제로 정리했습니다. 모든 예제에는 패턴, 플래그, 샘플 텍스트가 이미 채워진 정규식 테스터를 여는 사용해 보기 링크가 있어, 직접 고쳐 보며 일치 결과가 바뀌는 것을 볼 수 있습니다.

정규식은 어디서나 같아 보이지만 그렇지 않습니다. 후방 탐색은 JavaScript와 .NET에서는 길이 제한이 없고, Python에서는 고정 길이만, Java와 PCRE에서는 길이 상한이 있어야 하며, Go에는 아예 없습니다. Python은 이름 있는 그룹을 (?P<name>…)로 쓰고, PHP는 치환 문자열에서 이름을 쓸 수 없으며, \A, \K, (?R)을 아는 엔진은 일부뿐입니다. 엔진 선택기는 JavaScript, PCRE/PHP, Python, Go, Java, .NET에서 각 토큰의 지원 여부를 보여 주고, 대체 문법이 있다면 함께 알려 줍니다. 예제 자체는 JavaScript로 실행되므로, 다른 언어라면 메모를 읽고 배포 전에 해당 언어에서 테스트하세요.

사용 방법

  1. 토큰(\b, 전방 탐색)이나 작업(이메일, 공백 제거, 중복 단어)을 검색하거나, 상단 칩에서 섹션으로 바로 이동하세요.
  2. 엔진 막대에서 사용하는 언어를 고르세요. 지원하지 않는 토큰은 흐리게 표시되고, 각 항목 아래 메모에 그 언어에서 대신 쓰는 문법이 나옵니다.
  3. 정규식 테스터에서 사용해 보기를 클릭해 예제를 실시간으로 실행한 다음, 거기서 패턴이나 텍스트를 수정하세요.
  4. 항목 옆의 #으로 해당 항목에 바로 링크하거나, 인쇄 / PDF로 저장으로 2단 구성의 간결한 사본을 만드세요.

자주 묻는 질문

탐욕적 수량자와 게으른 수량자는 어떻게 다른가요?

탐욕적 수량자(*, +, {n,m})는 가능한 한 많은 문자를 가져간 뒤, 패턴의 나머지가 실패하면 일부를 돌려줍니다. 게으른 수량자(*?, +?, {n,m}?)는 가능한 한 적게 가져갑니다. <b>bold</b>에서 <.+>는 문자열 전체와 일치하지만 <.+?>는 <b>와 </b>에 각각 일치합니다. 소유 수량자(*+, ++)는 탐욕적이면서 문자를 절대 돌려주지 않으며, JavaScript, Go, .NET에는 없습니다.

후방 탐색을 지원하는 언어는 어디인가요?

JavaScript(ES2018부터)와 .NET은 길이에 제한 없는 후방 탐색을 허용합니다. Java는 최대 길이가 정해져 있어야 하므로 안에 *나 +를 쓸 수 없습니다. Python의 re 모듈은 고정 길이 후방 탐색만 받습니다. PCRE2는 10.43 이전까지 각 대안이 고정 길이여야 했고, 10.43에서 한도(기본 255자)까지의 가변 길이 후방 탐색이 추가되었습니다. Go의 RE2 엔진에는 전방 탐색도 후방 탐색도 없습니다.

악센트 문자와 라틴 문자가 아닌 글자까지 포함해 모든 문자와 일치시키려면 어떻게 하나요?

유니코드 속성 \p{L}을 쓰세요. JavaScript에서는 u 또는 v 플래그가 필요하고(/\p{L}+/u), PCRE, Go, Java, .NET은 그대로 지원합니다. [a-zA-Z]는 é, ß, 그리고 한글을 포함한 모든 비라틴 문자를 놓치며, \w는 JavaScript와 Go에서 ASCII만 일치합니다. Python 내장 re에는 \p{…}가 없으므로 서드파티 regex 모듈을 쓰거나, Python 3에서 유니코드 문자와 일치하는 [^\W\d_]를 쓰세요.

치환 문자열에서 캡처한 그룹은 어떻게 쓰나요?

언어에 따라 다릅니다. JavaScript, Java, .NET, Go, PHP는 $1, Python은 \1 또는 \g<1>입니다. 이름 있는 그룹은 JavaScript에서 $<name>, Java, .NET, Go에서 ${name}, Python에서 \g<name>입니다. PHP의 preg_replace에는 이름 형식이 없으므로 번호를 쓰세요. 전체 일치는 JavaScript와 .NET에서 $&, Java와 PHP에서 $0, Python에서 \g<0>입니다.

정규식이 JavaScript에서는 되는데 Python에서는 안 되는(또는 그 반대) 이유는 무엇인가요?

흔한 원인은 이렇습니다. 이름 있는 그룹(JavaScript는 (?<name>), Python은 (?P<name>)), \p{…} 속성(JavaScript는 지원, Python re는 미지원), 후방 탐색 길이(JavaScript는 제한 없음, Python은 고정), 인라인 플래그(맨 앞의 (?i)는 Python에서는 작동하지만 범위가 있는 (?i:…)만 있는 JavaScript에서는 오류), 그리고 \d나 \w가 Python에서는 유니코드 숫자와 문자에 일치하지만 JavaScript에서는 ASCII에만 일치한다는 점입니다. Python 문자열 이스케이프도 기억하세요. 패턴은 r"\d+"처럼 raw 문자열로 쓰세요.

정규식으로 이메일 주소를 검증해도 안전한가요?

형태 확인 용도로만 그렇습니다. [\w.+-]+@[\w-]+(?:\.[\w-]+)+ 같은 실용적인 패턴은 오타를 잡아 주지만, 일부 유효한 주소(따옴표로 묶은 로컬 부분, 국제화 도메인)는 거부하고 일부 유효하지 않은 주소는 통과시킵니다. 어떤 패턴도 메일함이 실제로 존재하는지는 알려 주지 못하므로, 형태는 느슨하게 확인하고 확인 이메일을 보내세요.

여러 언어에서 작동하는 패턴 작성하기

패턴이 여러 엔진에서 실행되어야 한다면(공유 검증 규칙, 여러 언어로 된 서비스가 읽는 설정 파일 등) 공통 부분집합 안에서만 쓰세요. 다음은 이 페이지의 여섯 엔진 모두에서 똑같이 동작합니다.

• 리터럴 문자, \.과 \$ 같은 이스케이프, 그리고 [abc], [^abc], [a-z] 클래스.

• \d, \s, \w (입력이 ASCII인 경우. Python과 .NET은 유니코드 숫자와 문자에도 일치합니다).

• ^와 $, \b, 대안(|), 캡처 그룹과 비캡처 그룹.

• 탐욕적·게으른 수량자: *, +, ?, {n}, {n,m}과 그 ? 형태.

전후방 탐색(Go에 없음), 역참조(Go), 소유 수량자와 원자 그룹(JavaScript, Go, .NET에 둘 중 하나 또는 둘 다 없음), 이름 있는 그룹(Python 문법이 다름), \p{…}(Python re에 없음)는 빼세요. 이 중 하나가 필요하다면 언어별로 패턴을 하나씩 두고 각각 테스트하세요.

치명적 백트래킹 피하기

백트래킹 엔진(JavaScript, PCRE, Python, Java, .NET)은 (a+)+$나 (\w|\d)*x처럼 수량자가 붙은 그룹이 같은 텍스트와 여러 방식으로 일치할 수 있는 패턴에서 지수 시간이 걸릴 수 있습니다. 거의 일치하는 긴 입력에서 엔진은 실패하기 전에 모든 분할을 시도하며, 웹 서버가 요청 하나에 멈춰 버릴 수 있습니다. 이것이 정규 표현식 서비스 거부(ReDoS) 문제입니다.

해결책은 기계적입니다. 같은 문자에 대해 수량자를 중첩하지 마세요. 대안끼리 서로 배타적이게 만드세요. 구분자를 안다면 .*? 대신 [^"]* 같은 부정 클래스를 쓰세요. 엔진에 있다면 소유 수량자나 원자 그룹을 쓰세요. 그리고 일치를 시도하기 전에 입력 길이를 제한하세요. .NET은 RegexOptions.NonBacktracking과 일치 시간 제한도 제공하고, PCRE에는 설정 가능한 일치 한도가 있으며, Go의 RE2 엔진은 백트래킹이 필요한 기능을 지원하지 않는 방식으로 선형 시간을 보장합니다.

문자열 안에서 정규식 이스케이프하기

실제 코드의 정규식 버그 대부분은 정규식이 아니라 문자열 이스케이프 버그입니다. 백슬래시는 언어의 문자열 리터럴과 정규식 엔진 모두에서 특별한 의미를 가지므로, 일반 문자열로 쓴 패턴에는 백슬래시가 두 번 필요합니다.

• JavaScript: 리터럴 /\d+/에는 백슬래시 하나, new RegExp("\\d+")에는 두 개가 필요합니다. String.raw`\d+`를 쓰면 두 번 쓰지 않아도 됩니다.

• Python: 항상 raw 문자열 r"\d+"를 쓰세요. 그렇지 않으면 "\b"는 단어 경계가 아니라 백스페이스 문자입니다.

• Java와 C#: 일반 문자열에서는 "\\d+"(Java 텍스트 블록도 이스케이프를 처리합니다). C# 축자 문자열 @"\d+"는 백슬래시를 입력한 그대로 유지합니다.

• Go: regexp.MustCompile에는 백틱 raw 문자열 `\d+`를 쓰는 것이 일반적입니다.

• PHP: 패턴에 구분자를 포함하며('/\d+/'), 작은따옴표 문자열은 대부분의 백슬래시를 입력한 그대로 유지합니다.

관련 무료 도구

  • 정규식 테스터 — 실시간 매치 강조, 캡처 그룹, 치환 미리보기로 정규 표현식을 샘플 텍스트에 테스트하세요. 무료, 브라우저에서 실행.
  • Git 치트 시트 — 마지막 커밋 취소, 브랜치 이름 변경, 원격 브랜치 삭제처럼 하려는 작업별로 정리한 Git 명령어. 최신 switch/restore와 기존 명령어, 위험 배지까지 함께 보여 줍니다.
  • 마크다운 치트 시트 — 모든 마크다운 요소를 소스와 렌더링 결과로 보여 주고, 확장 문법(표, 작업 목록, 각주, 수식, Mermaid, 알림), 9개 플랫폼 호환성 표, 실시간 플레이그라운드까지 제공합니다.
  • Cron 표현식 생성기 — 드롭다운으로 cron 일정을 만들거나 붙여 넣어 쉬운 말로 읽고, 다음 실행 10회를 내 시간대와 UTC로 확인하세요. 무료, 브라우저에서 실행.
  • 텍스트 비교 (Diff) — 텍스트, 코드, JSON 파일의 두 버전을 비교해 정확히 어떤 줄, 단어, 문자가 바뀌었는지 확인하세요.