정규식 문법 정리
정규표현식 문법과 주요 패턴을 정리한 치트시트입니다.
60개 패턴
기본 메타문자
| 패턴 | 설명 | 예시 |
|---|---|---|
. | 임의의 한 문자 (줄바꿈 제외) | a.c → abc, a1c, a c |
^ | 문자열/줄의 시작 | ^Hello → Hello로 시작하는 줄 |
$ | 문자열/줄의 끝 | end$ → end로 끝나는 줄 |
\ | 특수 문자 이스케이프 | \. → 리터럴 점(.) |
| | OR 연산 | cat|dog → cat 또는 dog |
() | 그룹 캡처 | (ab)+ → ab, abab |
(?:) | 비캡처 그룹 | (?:ab)+ → 그룹화만, 캡처 안함 |
수량자 (Quantifiers)
| 패턴 | 설명 | 예시 |
|---|---|---|
* | 0회 이상 반복 (탐욕적) | ab*c → ac, abc, abbc |
+ | 1회 이상 반복 (탐욕적) | ab+c → abc, abbc (ac는 ×) |
? | 0회 또는 1회 | colou?r → color, colour |
{n} | 정확히 n회 반복 | a{3} → aaa |
{n,} | n회 이상 반복 | a{2,} → aa, aaa, aaaa... |
{n,m} | n회 이상 m회 이하 | a{2,4} → aa, aaa, aaaa |
*? | 0회 이상 (게으른/최소 매칭) | <.*?> → 각 태그 개별 매칭 |
+? | 1회 이상 (게으른/최소 매칭) | .+? → 가능한 적게 매칭 |
?? | 0 또는 1회 (게으른) | a?? → 빈 문자열 우선 매칭 |
문자 클래스
| 패턴 | 설명 | 예시 |
|---|---|---|
[abc] | a, b, c 중 하나 | [aeiou] → 모음 한 글자 |
[^abc] | a, b, c를 제외한 문자 | [^0-9] → 숫자가 아닌 문자 |
[a-z] | 소문자 범위 | [a-zA-Z] → 영문자 |
[0-9] | 숫자 범위 | [0-9]+ → 하나 이상의 숫자 |
\d | 숫자 [0-9] | \d{3} → 세 자리 숫자 |
\D | 숫자가 아닌 문자 [^0-9] | \D+ → 숫자가 아닌 연속 문자 |
\w | 단어 문자 [a-zA-Z0-9_] | \w+ → 변수명 등 단어 |
\W | 단어 문자가 아닌 것 [^a-zA-Z0-9_] | \W → 특수문자, 공백 |
\s | 공백 문자 (스페이스, 탭, 줄바꿈) | \s+ → 연속 공백 |
\S | 공백이 아닌 문자 | \S+ → 공백 아닌 연속 문자 |
\b | 단어 경계 (위치) | \bword\b → 독립된 단어만 |
\B | 단어 경계가 아닌 곳 (위치) | \Bword → 단어 내부의 word |
전후방 탐색 (Lookaround)
| 패턴 | 설명 | 예시 |
|---|---|---|
(?=...) | 전방 탐색 (Positive Lookahead) | \d(?=px) → px 앞의 숫자 |
(?!...) | 부정 전방 탐색 (Negative Lookahead) | \d(?!px) → px 앞이 아닌 숫자 |
(?<=...) | 후방 탐색 (Positive Lookbehind) | (?<=\$)\d+ → $ 뒤의 숫자 |
(?<!...) | 부정 후방 탐색 (Negative Lookbehind) | (?<!\$)\d+ → $ 뒤가 아닌 숫자 |
그룹 & 역참조
| 패턴 | 설명 | 예시 |
|---|---|---|
(abc) | 캡처 그룹 | (\d+)-(\d+) → $1, $2로 참조 |
(?:abc) | 비캡처 그룹 (성능 향상) | (?:https?://) → 캡처 안함 |
(?<name>abc) | 이름 있는 캡처 그룹 | (?<year>\d{4}) → $<year> |
\1 | 역참조 (첫 번째 그룹) | (\w+)\s\1 → hello hello |
$1 또는 \1 | 치환 시 그룹 참조 | s/(\w+)/[$1]/g |
플래그 (Flags)
| 패턴 | 설명 | 예시 |
|---|---|---|
g | 전역 검색 (모든 매치 찾기) | /pattern/g |
i | 대소문자 무시 | /hello/i → Hello, HELLO 매칭 |
m | 여러 줄 모드 (^, $ 각 줄 적용) | /^start/m → 각 줄의 start |
s | dotAll (.이 줄바꿈도 매칭) | /a.b/s → a\nb도 매칭 |
u | 유니코드 지원 | /\p{Hangul}/u → 한글 매칭 |
y | sticky (lastIndex부터만 검색) | /\d+/y |
자주 쓰는 패턴
| 패턴 | 설명 | 예시 |
|---|---|---|
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ | 이메일 주소 검증 | |
^https?:\/\/(www\.)?[\w.-]+\.[a-zA-Z]{2,} | URL (http/https) | |
^01[016789]-?\d{3,4}-?\d{4}$ | 한국 휴대전화번호 | |
^\d{2,3}-?\d{3,4}-?\d{4}$ | 한국 전화번호 (일반) | |
^\d{3}-?\d{2}-?\d{5}$ | 사업자등록번호 | |
^\d{6}-?[1-4]\d{6}$ | 주민등록번호 | |
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ | 날짜 (YYYY-MM-DD) | |
^(0[1-9]|1[0-2]):(0[0-9]|[1-5]\d)$ | 시간 (HH:mm, 24시) | |
^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$ | HEX 색상코드 (#fff, #ffffff) | |
^-?\d+(\.\d+)?$ | 정수 또는 소수 (음수 포함) | |
^\d{1,3}(\.\d{1,3}){3}$ | IPv4 주소 (기본) | |
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*?&]{8,}$ | 비밀번호 (영문+숫자, 8자 이상) | |
<[^>]+> | HTML 태그 매칭 | |
<(\w+)[^>]*>.*?<\/\1> | HTML 여닫는 태그 쌍 | |
^\s+|\s+$ | 앞뒤 공백 (trim 용도) | |
\b\w+\b | 단어 추출 (단어 경계 사용) | |
(\d{1,3})(,\d{3})* | 천 단위 콤마 숫자 (1,000,000) |
자주 묻는 질문
정규표현식이란 무엇인가요?↓
정규표현식(Regular Expression, Regex)은 문자열에서 특정 패턴을 검색, 매칭, 치환하기 위한 문법입니다. JavaScript, Python, Java, Go, PHP 등 대부분의 프로그래밍 언어와 텍스트 에디터에서 지원됩니다.
탐욕적(Greedy)과 게으른(Lazy) 매칭의 차이는 무엇인가요?↓
탐욕적 매칭(*, +)은 가능한 한 많이 매칭합니다. 게으른 매칭(*?, +?)은 가능한 한 적게 매칭합니다. 예를 들어 "<b>a</b><b>b</b>"에서 <.*>는 전체를 하나로 매칭하지만, <.*?>는 <b>, </b> 등 각 태그를 개별로 매칭합니다.
정규식에서 이메일을 어떻게 검증하나요?↓
간단한 이메일 패턴은 ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$입니다. 다만 RFC 5322 표준에 완벽히 부합하는 이메일 검증은 정규식만으로는 매우 복잡하므로, 실제 서비스에서는 전용 라이브러리 사용을 권장합니다.
Lookahead와 Lookbehind는 무엇인가요?↓
Lookahead (?=...)는 뒤에 특정 패턴이 오는 위치를 매칭하고, Lookbehind (?<=...)는 앞에 특정 패턴이 있는 위치를 매칭합니다. 실제 문자를 소비하지 않는 "제로폭 어설션"이므로 조건부 매칭에 유용합니다.
캡처 그룹과 비캡처 그룹의 차이는 무엇인가요?↓
캡처 그룹 ()은 매칭된 부분을 기억하여 $1, $2 등으로 역참조할 수 있습니다. 비캡처 그룹 (?:)은 그룹화만 하고 캡처하지 않아 역참조가 불가하지만, 성능이 약간 더 좋고 그룹 번호를 소비하지 않습니다.
정규식 플래그 g, i, m, s의 의미는 무엇인가요?↓
g(global)는 모든 매치를 찾고, i(case-insensitive)는 대소문자를 무시합니다. m(multiline)은 ^와 $를 각 줄에 적용하고, s(dotAll)는 .이 줄바꿈 문자도 매칭하게 합니다.
한국어(한글) 정규식은 어떻게 작성하나요?↓
JavaScript에서 유니코드 플래그(u)와 함께 /\p{Script=Hangul}/u를 사용하거나, 유니코드 범위 [가-힣]으로 완성형 한글을, [ㄱ-ㅎㅏ-ㅣ가-힣]으로 자모 포함 한글을 매칭할 수 있습니다.