정규표현식 치트시트

패턴, 수량자, 전후방 탐색, 자주 쓰는 정규식 레시피를 한눈에. 검색과 필터링으로 빠르게 찾아보세요.

🔤

기본 패턴

7 items

.

줄바꿈을 제외한 모든 문자 1개와 매치

h.t  →  "hat", "hit", "hot"
Tip: s (dotall) 플래그를 사용하면 .이 줄바꿈도 매치합니다

\d \w \s

숫자, 단어 문자(영숫자+_), 공백 매치

\d  →  0-9
\w  →  a-z, A-Z, 0-9, _
\s  →  space, tab, newline
Tip: 대문자 버전(\D, \W, \S)은 반대 의미입니다 — 숫자가 아닌 것, 단어가 아닌 것 등

[abc]

문자 클래스 — 대괄호 안의 문자 중 하나와 매치

[aeiou]    →  any vowel
[0-9a-f]   →  hex digit
[A-Za-z]   →  any letter

[^abc]

부정 문자 클래스 — 대괄호 안의 문자를 제외한 문자와 매치

[^0-9]     →  any non-digit
[^\s]      →  any non-whitespace

^ and $

문자열의 시작(^)과 끝($) 앵커

^Hello     →  starts with "Hello"
world$     →  ends with "world"
^exact$    →  matches only "exact"
Tip: m (multiline) 플래그를 사용하면 각 줄의 시작/끝을 매치합니다

| (alternation)

OR 연산 — 왼쪽 또는 오른쪽 패턴과 매치

cat|dog       →  "cat" or "dog"
(Mon|Fri)day  →  "Monday" or "Friday"
Tip: 교대(|)는 그룹 없이 사용하면 전체 패턴에 적용됩니다. 범위를 제한하려면 괄호로 감싸세요

\\ (escape)

특수 문자를 리터럴로 매치하려면 백슬래시로 이스케이프

\.   →  literal dot
\$   →  literal dollar sign
\(   →  literal parenthesis
\\   →  literal backslash
🔢

수량자

6 items

* (zero or more)

앞의 요소가 0번 이상 반복

colou*r  →  "color", "colour", "colouur"

+ (one or more)

앞의 요소가 1번 이상 반복

\d+  →  "1", "42", "3000" (at least one digit)
Tip: +는 {1,}과 동일합니다. 최소 1개 이상의 매치가 필요할 때 사용하세요

? (zero or one)

앞의 요소가 0번 또는 1번 (선택적)

https?://  →  "http://" or "https://"

{n} {n,} {n,m}

정확히 n번, n번 이상, n~m번 반복

\d{4}      →  exactly 4 digits ("2024")
\d{2,}     →  2 or more digits
\w{3,8}    →  3 to 8 word characters

*? +? ?? (lazy)

게으른 수량자 — 최소한의 문자와 매치

Greedy:  <.+>   on "<b>bold</b>"  →  "<b>bold</b>"
Lazy:   <.+?>  on "<b>bold</b>"  →  "<b>"
Tip: 기본 수량자는 탐욕적(greedy)으로 최대한 많이 매치합니다. ?를 뒤에 붙이면 게으른(lazy) 매치로 전환됩니다

*+ ++ (possessive)

소유적 수량자 — 역추적(backtrack) 방지

\d++\.\d++  →  matches "3.14" without backtracking
(only supported in Java, PCRE — not JavaScript)
📎

그룹 & 캡처

6 items

(group)

캡처 그룹 — 매치를 캡처하고 역참조 가능

(\d{3})-(\d{4})
on "555-1234"  →  group 1: "555", group 2: "1234"

(?:non-capture)

비캡처 그룹 — 그룹핑하지만 캡처하지 않음

(?:https?|ftp)://
Groups the protocol but does not capture it
Tip: 캡처가 필요 없을 때 비캡처 그룹을 사용하면 성능이 향상됩니다

(?<name>named)

명명된 캡처 그룹 — 이름으로 참조 가능

(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
match.groups.year  →  "2024"

\1 \2 (backreference)

역참조 — 이전에 캡처한 그룹과 동일한 텍스트 매치

(\w+)\s\1    →  "hello hello" (repeated word)
(['"]).*?\1  →  matches quoted strings

(a|b) in groups

그룹 내 교대 — 그룹 안에서 OR 패턴 사용

(cat|dog|bird) food  →  "cat food", "dog food", "bird food"

(?<name>...) with replace

명명된 그룹을 치환에서 사용하는 방법

// Reformat date: MM/DD/YYYY → YYYY-MM-DD
str.replace(
  /(?<m>\d{2})\/(?<d>\d{2})\/(?<y>\d{4})/,
  '$<y>-$<m>-$<d>'
)
👀

전후방 탐색

5 items

(?=...) positive lookahead

긍정 전방 탐색 — 뒤에 패턴이 오는 경우에만 매치

\d+(?= dollars)
"100 dollars"  →  matches "100"
"100 euros"    →  no match
Tip: Lookaround은 문자를 소비하지 않으므로 매치 결과에 포함되지 않습니다

(?!...) negative lookahead

부정 전방 탐색 — 뒤에 패턴이 오지 않는 경우에만 매치

\d+(?! dollars)
"100 euros"    →  matches "100"
"100 dollars"  →  no match on "100"

(?<=...) positive lookbehind

긍정 후방 탐색 — 앞에 패턴이 오는 경우에만 매치

(?<=\$)\d+
"$50"   →  matches "50"
"€50"   →  no match

(?<!...) negative lookbehind

부정 후방 탐색 — 앞에 패턴이 오지 않는 경우에만 매치

(?<!\d)px
"16px"   →  no match
"top px" →  matches "px"

Combined lookaround

전후방 탐색 결합 — 비밀번호 강도 검증 예시

// At least 8 chars, 1 upper, 1 lower, 1 digit
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
Tip: 여러 lookahead를 ^에서 연달아 사용하면 여러 조건을 동시에 검증할 수 있습니다
🎯

문자 클래스

6 items

\d \D

숫자 / 숫자가 아닌 문자

\d   →  [0-9]
\D   →  [^0-9]

\w \W

단어 문자 / 단어 문자가 아닌 문자

\w   →  [A-Za-z0-9_]
\W   →  [^A-Za-z0-9_]

\s \S

공백 / 공백이 아닌 문자

\s   →  [ \t\n\r\f\v]
\S   →  [^ \t\n\r\f\v]

\b \B

단어 경계 / 비단어 경계

\bcat\b    →  "cat" but not "catch" or "bobcat"
\Bcat\B    →  "concatenate" but not "cat"
Tip: \b는 단어 전체를 정확히 매치할 때 매우 유용합니다

[a-z] [A-Z] [0-9]

범위를 사용한 문자 클래스

[a-z]     →  lowercase letter
[A-Z]     →  uppercase letter
[0-9]     →  same as \d
[a-f0-9]  →  hex digit (lowercase)

\p{L} \p{N} (Unicode)

유니코드 카테고리 — 모든 언어의 문자/숫자 매치

\p{L}   →  any Unicode letter (한글, 日本語, etc.)
\p{N}   →  any Unicode number
\p{Sc}  →  currency symbols ($, €, ¥)
Tip: JavaScript에서는 u 플래그를 함께 사용해야 합니다: /\p{L}/u
📋

자주 쓰는 패턴

8 items

Email validation

이메일 주소 검증 패턴

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Tip: 완벽한 이메일 검증은 regex만으로는 어렵습니다. 기본 형식 체크 후 실제 발송으로 확인하세요

URL matching

URL 매치 패턴 (http/https)

https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-._~:?#\[\]@!$&'()*+,;=]*
Tip: 프로덕션에서는 URL() 생성자로 파싱하고, regex는 텍스트에서 URL을 추출할 때 사용하세요

Phone number (intl)

국제 전화번호 패턴 (E.164 형식)

^\+?[1-9]\d{1,14}$

// US format
^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$

IPv4 address

IPv4 주소 매치 (0.0.0.0 ~ 255.255.255.255)

^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$

Date (YYYY-MM-DD)

ISO 날짜 형식 (YYYY-MM-DD)

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$

Password strength

비밀번호 강도 검증 (대소문자, 숫자, 특수문자, 8자 이상)

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$

Slug / username

슬러그 또는 사용자 이름 (소문자, 숫자, 하이픈)

^[a-z0-9]+(?:-[a-z0-9]+)*$

"my-cool-slug"  →  match
"My Slug!"      →  no match

HTML tag extraction

HTML 태그 추출 (간단한 경우에만 사용)

<([a-z][a-z0-9]*)\[^>]*>(.*?)<\/\1>
Tip: HTML 파싱에는 DOM 파서를 사용하세요. Regex는 단순한 경우에만 적합합니다
🚩

플래그

6 items

g (global)

전역 매치 — 첫 매치 이후에도 계속 검색

"banana".match(/a/g)   →  ["a", "a", "a"]
"banana".match(/a/)    →  ["a"] (first only)
Tip: g 플래그 사용 시 .test()와 .exec()는 lastIndex를 업데이트하므로 연속 호출 시 결과가 달라질 수 있습니다

i (case-insensitive)

대소문자 무시 매치

/hello/i.test("Hello")  →  true
/hello/.test("Hello")   →  false

m (multiline)

멀티라인 모드 — ^와 $가 각 줄의 시작/끝을 매치

const text = "line1\nline2"
/^line2$/m.test(text)  →  true
/^line2$/.test(text)   →  false

s (dotall)

. 이 줄바꿈(\n)도 포함하여 매치

/a.b/s.test("a\nb")  →  true
/a.b/.test("a\nb")   →  false

u (unicode)

유니코드 모드 — \p{} 패턴과 올바른 유니코드 처리 활성화

/^\p{L}+$/u.test("café")  →  true
/^\p{L}+$/.test("café")   →  SyntaxError
Tip: 유니코드 문자(이모지, 한글 등)를 다룰 때는 항상 u 플래그를 사용하세요

y (sticky)

고정 매치 — lastIndex 위치에서만 매치

const re = /\d+/y
re.lastIndex = 4
re.exec("abc 123")  →  "123"

JavaScript Regex API

7 items

RegExp constructor

동적 패턴 생성 — 변수를 포함한 정규식 만들기

const word = "hello"
const re = new RegExp(word, 'gi')
re.test("Hello World")  →  true
Tip: 사용자 입력으로 RegExp를 만들 때는 특수문자를 이스케이프하세요

.test()

패턴 매치 여부를 boolean으로 반환

/^\d+$/.test("123")  →  true
/^\d+$/.test("abc")  →  false

.match()

매치 결과를 배열로 반환 (g 플래그 유무에 따라 다름)

"2024-01-15".match(/(\d{4})-(\d{2})-(\d{2})/)
→  ["2024-01-15", "2024", "01", "15"]

.matchAll()

모든 매치를 이터레이터로 반환 (캡처 그룹 포함)

const text = "a1 b2 c3"
for (const m of text.matchAll(/([a-z])(\d)/g)) {
  console.log(m[1], m[2])
}
// a 1,  b 2,  c 3

.replace() / .replaceAll()

패턴에 매치되는 부분을 치환

"foo bar foo".replace(/foo/g, "baz")
→  "baz bar baz"

// With capture group
"John Smith".replace(/(\w+) (\w+)/, "$2, $1")
→  "Smith, John"

.split()

정규식 패턴으로 문자열 분리

"one, two;  three".split(/[,;]\s*/)
→  ["one", "two", "three"]

"camelCase".split(/(?=[A-Z])/)
→  ["camel", "Case"]

.search()

패턴이 처음 나타나는 인덱스 반환 (-1 if not found)

"Hello World".search(/world/i)  →  6
"Hello World".search(/xyz/)     →  -1

정규표현식 치트시트 사용 가이드

정규표현식(Regular Expression)은 문자열 패턴 매칭과 텍스트 처리를 위한 강력한 도구입니다. 이 치트시트에서 기본 패턴부터 전후방 탐색, 실전 레시피까지 빠르게 참고할 수 있습니다.

정규식 작성 팁

복잡한 정규식은 작은 단위로 나눠서 작성하세요. 먼저 간단한 패턴으로 시작하고, 점진적으로 조건을 추가합니다. 비캡처 그룹 (?:...)을 활용하면 성능이 향상되고, 명명된 그룹 (?<name>...)은 가독성을 높여줍니다.

실전에서 주의할 점

HTML이나 JSON 파싱에 정규식을 사용하는 것은 권장되지 않습니다. 전용 파서를 사용하세요. 또한 사용자 입력을 RegExp 생성자에 직접 넘기면 ReDoS(Regular Expression Denial of Service) 공격에 취약할 수 있으니 반드시 이스케이프 처리하세요.

디버깅 도구

regex101.com이나 Vivory의 Regex Tester를 활용하면 정규식을 실시간으로 테스트하고 각 토큰의 의미를 시각적으로 확인할 수 있습니다. 복잡한 패턴은 x (verbose) 플래그로 주석을 추가할 수도 있습니다 (Python/PCRE 한정).

FAQ

Related Tools

Also Used Together