정규표현식 치트시트
패턴, 수량자, 전후방 탐색, 자주 쓰는 정규식 레시피를 한눈에. 검색과 필터링으로 빠르게 찾아보세요.
기본 패턴
7 items.
줄바꿈을 제외한 모든 문자 1개와 매치
h.t → "hat", "hit", "hot"
\d \w \s
숫자, 단어 문자(영숫자+_), 공백 매치
\d → 0-9 \w → a-z, A-Z, 0-9, _ \s → space, tab, newline
[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"
| (alternation)
OR 연산 — 왼쪽 또는 오른쪽 패턴과 매치
cat|dog → "cat" or "dog" (Mon|Fri)day → "Monday" or "Friday"
\\ (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)
? (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>"
*+ ++ (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
(?<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
(?!...) 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,}$문자 클래스
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"
[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 ($, €, ¥)자주 쓰는 패턴
8 itemsEmail validation
이메일 주소 검증 패턴
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$URL matching
URL 매치 패턴 (http/https)
https?:\/\/[\w\-]+(\.[\w\-]+)+[\/\w\-._~:?#\[\]@!$&'()*+,;=]*
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>
플래그
6 itemsg (global)
전역 매치 — 첫 매치 이후에도 계속 검색
"banana".match(/a/g) → ["a", "a", "a"] "banana".match(/a/) → ["a"] (first only)
i (case-insensitive)
대소문자 무시 매치
/hello/i.test("Hello") → true
/hello/.test("Hello") → falsem (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") → falseu (unicode)
유니코드 모드 — \p{} 패턴과 올바른 유니코드 처리 활성화
/^\p{L}+$/u.test("café") → true
/^\p{L}+$/.test("café") → SyntaxErrory (sticky)
고정 매치 — lastIndex 위치에서만 매치
const re = /\d+/y
re.lastIndex = 4
re.exec("abc 123") → "123"JavaScript Regex API
7 itemsRegExp constructor
동적 패턴 생성 — 변수를 포함한 정규식 만들기
const word = "hello"
const re = new RegExp(word, 'gi')
re.test("Hello World") → true.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 한정).