정규식 치트 시트: 일반적인 패턴 및 빠른 참조
· 12분 읽기
목차
정규식은 개발자 도구 상자에서 가장 강력한 도구 중 하나이지만, 많은 프로그래머들에게 여전히 어렵게 느껴집니다. 이 포괄적인 치트 시트는 정규식 패턴을 즉시 사용할 수 있는 실용적인 예제와 함께 이해하기 쉬운 섹션으로 나눕니다.
이메일 주소 검증, 로그 파일 파싱, 지저분한 데이터 정리 등 무엇을 하든, 이 가이드는 더 나은 정규식 패턴을 더 빠르게 작성하는 데 도움이 될 것입니다. 기본 문자 매칭부터 고급 전후방탐색 어설션까지 모든 것을 다룹니다.
정규식 기초
정규식(regex 또는 regexp)은 문자열에서 문자 조합을 매칭하는 데 사용되는 패턴입니다. JavaScript, Python, Java, PHP, Ruby, Go 등 거의 모든 프로그래밍 언어와 VS Code, Sublime Text와 같은 텍스트 편집기, 그리고 grep, sed와 같은 명령줄 도구에서 지원됩니다.
정규식 패턴의 핵심은 두 가지 유형의 문자로 구성됩니다: 정확히 일치하는 리터럴 문자와 특별한 의미를 가지며 매칭 규칙을 정의하는 메타문자입니다.
가장 간단한 정규식은 리터럴 문자열입니다. hello 패턴은 나타나는 곳마다 "hello" 텍스트와 정확히 일치합니다. 하지만 진정한 힘은 유연성을 추가하는 메타문자에서 나옵니다—모든 숫자 매칭, 패턴 반복, 특정 위치에 고정하기 등.
프로 팁: 정규식 테스터를 사용하여 실시간으로 패턴을 실험해보세요. 입력하는 동안 즉시 매치가 강조 표시되어 패턴이 어떻게 작동하는지 훨씬 쉽게 이해할 수 있습니다.
리터럴 문자 vs 메타문자
정규식 패턴의 대부분의 문자는 리터럴입니다—자기 자신과 일치합니다. cat 패턴은 정확히 그 순서대로 c, a, t 문자와 일치합니다. 그러나 특정 문자는 특별한 의미를 가집니다:
. ^ $ * + ? { } [ ] \ | ( )는 메타문자입니다- 이들을 리터럴로 매칭하려면 백슬래시로 이스케이프하세요:
\.는 마침표와 일치합니다 - 문자 클래스
[]내부에서는 대부분의 메타문자가 특별한 의미를 잃습니다
예를 들어, example\.com은 "example.com"과 리터럴로 일치하지만, example.com은 이스케이프되지 않은 점이 모든 문자와 일치하기 때문에 "exampleXcom"과도 일치합니다.
문자 클래스
문자 클래스를 사용하면 가능한 문자 집합에서 하나의 문자를 매칭할 수 있습니다. 이는 유연한 패턴 매칭의 기초이며 두 가지 형태로 제공됩니다: 미리 정의된 단축 클래스와 사용자 정의 대괄호 표현식.
| 패턴 | 매칭 | 예제 |
|---|---|---|
. |
개행 문자를 제외한 모든 문자 | h.t → hat, hot, hit, h@t |
\d |
모든 숫자 [0-9] | \d{3} → 123, 456, 789 |
\D |
숫자가 아닌 모든 문자 | \D+ → abc, xyz, @#$ |
\w |
단어 문자 [a-zA-Z0-9_] | \w+ → hello_world, var123 |
\W |
단어 문자가 아닌 문자 | \W → @, #, 공백, 구두점 |
\s |
공백 문자 (공백, 탭, 개행) | \s+ → 모든 공백 시퀀스 |
\S |
공백이 아닌 문자 | \S+ → 모든 보이는 문자 |
[abc] |
a, b, 또는 c 중 하나 | [aeiou] → 모든 모음 |
[^abc] |
a, b, c가 아닌 문자 | [^0-9] → 숫자가 아닌 모든 문자 |
[a-z] |
범위: a부터 z까지 | [A-Za-z] → 모든 문자 |
[a-z0-9] |
여러 범위 | [a-fA-F0-9] → 16진수 숫자 |
사용자 정의 문자 클래스
대괄호 표현식 []을 사용하면 자신만의 문자 집합을 정의할 수 있습니다. 대괄호 내부에서는 대부분의 메타문자가 특별한 의미를 잃습니다—이스케이프할 필요가 없습니다.
[aeiou]는 모든 단일 모음과 일치합니다[0-9]는 모든 숫자와 일치합니다 (\d와 동일)[a-zA-Z]는 대소문자 모든 문자와 일치합니다[^0-9]는 숫자를 제외한 모든 것과 일치합니다 (^는 클래스를 부정합니다)[a-z-]는 소문자 또는 하이픈과 일치합니다 (끝의 하이픈은 리터럴입니다)
빠른 팁: 문자 클래스 내 문자의 순서는 중요하지 않습니다. [abc]와 [bca]는 동일합니다. 클래스는 문자 중 하나라도 있으면 일치합니다.
실용적인 예제
다음은 문자 클래스의 실제 사용 예입니다:
[A-Z][a-z]+는 "Hello" 또는 "World"와 같은 대문자로 시작하는 단어와 일치합니다\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}는 IP 주소와 일치합니다 (기본 패턴)[a-fA-F0-9]{6}는 "FF5733"과 같은 16진수 색상 코드와 일치합니다[^\s]+는 공백이 아닌 모든 시퀀스와 일치합니다 (가장 넓은 의미의 "단어")
수량자와 반복
수량자는 패턴이 몇 번 반복되어야 하는지 지정합니다. 반복하려는 요소(문자, 문자 클래스 또는 그룹) 뒤에 배치됩니다.
| 수량자 | 의미 | 예제 |
|---|---|---|
* |
0회 이상 | ab*c → ac, abc, abbc, abbbc |
+ |
1회 이상 | ab+c → abc, abbc (ac는 아님) |
? |
0회 또는 1회 (선택적) | colou?r → color, colour |
{n} |
정확히 n회 | \d{4} → 2026, 1999 |
{n,} |
n회 이상 | \w{3,} → 3자 이상의 단어 |
{n,m} |
n회에서 m회 사이 | \d{2,4} → 12, 123, 1234 |
*? |
게으른/최소 매칭 (0회 이상) | <.*?> → 첫 번째 태그만 |
+? |
게으른/최소 매칭 (1회 이상) | ".+?" → 첫 번째 따옴표 문자열 |
?? |
게으른/최소 매칭 (0회 또는 1회) | \d?? → 가능하면 0개의 숫자와 일치 |
탐욕적 vs 게으른 매칭
이것은 정규식에서 가장 중요한 개념 중 하나입니다. 기본적으로 수량자는 탐욕적입니다—전체 패턴이 여전히 일치할 수 있도록 하면서 가능한 한 많은 텍스트와 일치합니다.
HTML 문자열 <b>bold</b> and <i>italic</i>를 고려해보세요:
<.*>(탐욕적)은 첫 번째<부터 마지막>까지 전체 문자열과 일치합니다<.*?>(게으른)은<b>, 그 다음</b>, 그 다음<i>, 그 다음</i>와 각각 별도로 일치합니다
수량자 뒤에 ?를 추가하면 게으른 (비탐욕적 또는 최소라고도 함) 매칭이 됩니다. 패턴이 여전히 성공할 수 있도록 하면서 가능한 한 적은 텍스트와 일치합니다.
프로 팁: 구분 기호(따옴표, 태그, 괄호) 사이의 내용을 추출할 때는 거의 항상 게으른 수량자를 사용하세요. ".*?" 패턴은 개별 따옴표 문자열을 올바르게 추출하지만, ".*"는 전체 텍스트에서 첫 번째 따옴표부터 마지막 따옴표까지 일치합니다.
일반적인 수량자 패턴
다음은 지속적으로 사용하게 될 패턴입니다:
\d+는 하나 이상의 숫자와 일치합니다 (42, 1000, 7과 같은 숫자)\w+는 하나 이상의 단어 문자와 일치합니다 (식별자, 변수 이름)\s*는 선택적 공백과 일치합니다 (0개 이상의 공백/탭).+?는 모든 문자와 게으르게 일치합니다 (마커 사이의 내용)[a-z]{2,}는 최소 2개의 소문자가 있는 단어와 일치합니다\d{3}-\d{3}-\d{4}는 555-123-4567과 같은 전화번호와 일치합니다
앵커와 경계
앵커는 문자와 일치하지 않습니다—문자열의 위치와 일치합니다. 텍스트의 어디에서나가 아닌 특정 위치에서 패턴이 일치하도록 보장하는 데 필수적입니다.
| 앵커 | 위치 | 예제 |
|---|---|---|
^ |
문자열의 시작 (또는 m 플래그가 있는 줄) | ^Hello → "Hello world"와 일치하지만 "Say Hello"와는 일치하지 않음 |
$ |
문자열의 끝 (또는 m 플래그가 있는 줄) | end$ → "The end"와 일치하지만 "end of story"와는 일치하지 않음 |
\b |
단어 경계 | \bcat\b → "cat"과 일치하지만 "category"와는 일치하지 않음 |
\B |
단어 경계가 아님 | \Bcat\B → "concatenate"와 일치하지만 "cat"과는 일치하지 않음 |
\A |
문자열의 시작 (줄이 아님) | ^와 유사하지만 다중 줄 모드를 무시함 |
\Z |
문자열의 끝 (줄이 아님) | $와 유사하지만 다중 줄 모드를 무시함 |
단어 경계 설명
단어 경계 \b는 매우 유용하지만 종종 오해됩니다. 단어 문자(\w)와 비단어 문자(\W) 사이의 위치, 또는 문자열의 시작/끝과 일치합니다.
다양한 문자열에 적용된 \bcat\b 패턴을 고려해보세요:
- "the cat sat" → 일치 (cat이 공백으로 둘러싸여 있음)
- "category" → 일치하지 않음 (cat 뒤에 단어 문자 'e'가 있음)
- "concatenate" → 일치하지 않음 (cat 앞뒤로 단어 문자가 있음)
- "cat" → 일치 (cat이 문자열의 시작과 끝에 있음)
- "cat!" → 일치 (cat 뒤에 비단어 문자인 구두점이 있음)
이것은 \b를 더 큰 단어의 일부와 실수로 일치하지 않고 전체 단어를 찾는 데 완벽하게 만듭니다.
시작과 끝 앵커
^와 $ 앵커는 검증에 필수적입니다. 전체 문자열이 패턴과 일치하도록 보장하려면 (단지 포함하는 것이 아니라) 패턴을 이러한 앵커로 감싸세요.
^\d+$는 전체 문자열이 숫자임을 보장합니다 (숫자 입력 검증)^[A-Z]는 문자열이 대문자로 시작하도록 보장합니다[.!?]$는 문자열이 구두점으로 끝나도록 보장합니다^https?://는 URL이 http:// 또는 https://로 시작하도록 보장합니다
빠른 팁: 사용자 입력(이메일, 전화번호, 사용자 이름)을 검증할 때는 항상 ^와 $를 사용하여 패턴을 고정하세요. 이것들이 없으면 \d{3} 패턴은 정확히 3자리 숫자가 아닌 것을 거부하려고 할 때 "abc123def"를 허용할 것입니다.
그룹과 캡처
괄호 ()는 정규식에서 두 가지 목적을 제공합니다: 패턴의 일부를 함께 그룹화하고, 나중에 사용하기 위해 일치하는 텍스트를 캡처합니다. 이것이 정규식이 추출 및 변환에 진정으로 강력해지는 부분입니다.
| 구문 | 목적 | 예제 |
|---|---|---|
(abc) |
캡처 그룹 | (\d{3})-(\d{4})는 지역 번호와 번호를 캡처합니다 |
(?:abc) |
비캡처 그룹 | (?:https?://)?example\.com은 캡처 없이 그룹화합니다 |
(a|b) |
교체 (OR) | (cat|dog)는 "cat" 또는 "dog"와 일치합니다 |
\1 |
그룹 1에 대한 역참조 | (\w+)\s+\1은 "the the"와 같은 반복된 단어와 일치합니다 |
(?<name>abc) |
명명된 캡처 그룹 | (?<year>\d{4})-(?<month>\d{2})는 날짜용입니다 |
캡처 그룹
패턴의 일부를 괄호로 감싸면 정규식 엔진이 일치하는 텍스트를 캡처합니다. 그런 다음 코드에서 또는 역참조를 사용하여 정규식 자체 내에서 이러한 캡처를 참조할 수 있습니다.
예를 들어, "555-123-4567"에 적용된 (\d{3})-(\d{3})-(\d{4}) 패턴은 세 개의 캡처를 생성합니다:
- 그룹 1: "555"
- 그룹 2: "123"
- 그룹 3: "4567"
대부분의 프로그래밍 언어에서 매치 객체나 대체 문자열을 통해 이러한 캡처에 액세스할 수 있습니다. 이를 통해 데이터를 쉽게 재포맷할 수 있습니다—($1) $2-$3와 같은 대체를 사용하여 "555-123-4567"을 "(555) 123-4567"로 변환할 수 있습니다.
비캡처 그룹
때로는 수량자나 교체를 위해 그룹화가 필요하지만 텍스트를 캡처할 필요는 없습니다. (?:..