정규표현식 패턴 치트시트: 일반적인 표현식 설명
· 12분 읽기
목차
정규표현식(regex)은 개발자의 무기고에서 가장 강력한 도구 중 하나입니다. 이메일 주소 검증, 로그 파일 파싱, 텍스트에서 데이터 추출, 복잡한 검색 및 바꾸기 작업 구축 등 무엇을 하든, 정규표현식은 텍스트 패턴을 다루는 간결하고 유연한 방법을 제공합니다.
이 포괄적인 가이드는 기본 구문부터 고급 기법까지 모든 것을 다루며, 프로젝트에서 즉시 사용할 수 있는 실용적인 예제를 제공합니다. 다양한 프로그래밍 언어에서 정규표현식을 살펴보고, 성능 최적화 팁을 공유하며, 숙련된 개발자도 실수하는 일반적인 오류를 피하는 방법을 알려드립니다.
정규표현식 기초
핵심적으로 정규표현식은 검색 패턴을 정의하는 문자 시퀀스입니다. 이 패턴을 문자열에 대해 실행하면, 정규표현식 엔진은 지정한 규칙에 따라 일치하는 항목을 찾으려고 시도합니다.
정규표현식 패턴은 두 가지 유형의 문자로 구성됩니다: 정확히 일치하는 리터럴 문자와 특별한 의미를 가진 메타문자입니다. 예를 들어, /hello/ 패턴은 문자열의 어디에서나 리터럴 텍스트 "hello"와 일치합니다. 그러나 /h.llo/는 점 메타문자를 사용하여 "hello", "hallo", "hxllo" 또는 "h"로 시작하고 "llo"로 끝나는 다른 5자 시퀀스와 일치합니다.
필수 메타문자
매일 사용하게 될 가장 기본적인 정규표현식 메타문자의 참조 표입니다:
| 메타문자 | 설명 | 예제 | 일치 |
|---|---|---|---|
. |
모든 단일 문자 (줄바꿈 제외) | c.t |
cat, cot, c9t, c@t |
\d |
모든 숫자 [0-9] | \d{3} |
123, 456, 789 |
\D |
숫자가 아닌 모든 것 | \D+ |
abc, XYZ, @#$ |
\w |
단어 문자 [a-zA-Z0-9_] | \w+ |
hello, test_123 |
\W |
단어 문자가 아닌 것 | \W |
@, #, 공백, ! |
\s |
공백 문자 (공백, 탭, 줄바꿈) | \s+ |
단일 또는 여러 공백 |
\S |
공백이 아닌 문자 | \S+ |
모든 보이는 문자 |
\b |
단어 경계 | \bcat\b |
"cat"이지만 "category"는 아님 |
^ |
문자열/줄의 시작 | ^Hello |
"Hello"로 시작하는 줄 |
$ |
문자열/줄의 끝 | end$ |
"end"로 끝나는 줄 |
프로 팁: 정규표현식 테스터를 사용하여 이러한 패턴을 실시간으로 실험해보세요. 자신의 샘플 텍스트로 테스트하고 일치 항목이 즉시 강조 표시되는 것을 볼 수 있습니다.
특수 문자 이스케이프
리터럴 메타문자(점이나 별표 같은)를 일치시켜야 할 때는 백슬래시로 이스케이프해야 합니다. 예를 들어, \.는 리터럴 마침표와 일치하고, \*는 리터럴 별표와 일치합니다.
이스케이프가 필요한 문자는 다음과 같습니다: . * + ? ^ $ { } [ ] ( ) | \
문자 클래스 및 수량자
문자 클래스를 사용하면 일치시킬 문자 집합을 정의할 수 있고, 수량자는 패턴이 반복되어야 하는 횟수를 지정합니다. 이들은 함께 대부분의 정규표현식 패턴의 기반을 형성합니다.
문자 클래스
대괄호는 괄호 안의 모든 단일 문자와 일치하는 문자 클래스를 만듭니다:
| 패턴 | 설명 | 일치 예제 |
|---|---|---|
[abc] |
a, b 또는 c와 일치 | a, b, c (한 문자) |
[^abc] |
a, b 또는 c를 제외한 모든 것과 일치 | d, e, 1, @, 등 |
[a-z] |
모든 소문자와 일치 | a부터 z까지 |
[A-Z] |
모든 대문자와 일치 | A부터 Z까지 |
[0-9] |
모든 숫자와 일치 | 0부터 9까지 (\d와 동일) |
[a-zA-Z] |
모든 문자와 일치 | 모든 문자, 대소문자 구분 없음 |
[a-zA-Z0-9] |
모든 영숫자와 일치 | 문자와 숫자 |
[a-z&&[^aeiou]] |
자음만 (교집합) | b, c, d, f, g, 등 |
수량자
수량자는 앞의 요소가 일치해야 하는 횟수를 지정합니다. 다양한 길이의 패턴을 일치시키는 데 필수적입니다:
*— 0회 이상 (탐욕적)+— 1회 이상 (탐욕적)?— 0회 또는 1회 (선택적){3}— 정확히 3회{3,}— 3회 이상{3,6}— 3회에서 6회 사이*?— 0회 이상 (게으른/비탐욕적)+?— 1회 이상 (게으른/비탐욕적)??— 0회 또는 1회 (게으른)
탐욕적 vs. 게으른 매칭
탐욕적 수량자와 게으른 수량자의 차이를 이해하는 것은 효율적인 정규표현식 패턴을 작성하는 데 중요합니다. 기본적으로 수량자는 탐욕적입니다 — 전체 패턴이 여전히 일치하도록 하면서 가능한 한 많은 텍스트를 일치시킵니다.
문자열 "<div>content</div><div>more</div>"를 사용한 예제를 고려해보세요:
- 탐욕적:
<div>.*</div>는 첫 번째<div>부터 마지막</div>까지 전체 문자열과 일치합니다 - 게으른:
<div>.*?</div>는 각<div>...</div>쌍을 개별적으로 일치시킵니다
게으른 버전은 수량자 뒤에 ?를 추가하여 정규표현식 엔진에 패턴을 만족시키면서 가능한 한 적게 일치시키도록 지시합니다.
빠른 팁: HTML이나 XML을 파싱할 때는 여러 태그에 걸쳐 일치하는 것을 피하기 위해 항상 게으른 수량자를 사용하세요. 더 나은 방법은 복잡한 마크업에 대해 정규표현식 대신 적절한 파서 라이브러리를 사용하는 것입니다.
일반적인 정규표현식 패턴
다음은 일반적인 검증 및 추출 작업을 위한 실전 테스트를 거친 정규표현식 패턴입니다. 이러한 패턴은 전 세계 프로덕션 애플리케이션에서 사용됩니다.
이메일 검증
대부분의 실제 사례를 다루는 실용적인 이메일 검증 패턴:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
이 패턴은 이메일에 로컬 부분(@ 앞), 도메인 이름 및 유효한 최상위 도메인이 있는지 확인합니다. 정규표현식만으로는 완벽한 이메일 검증이 불가능하다는 점에 유의하세요 — 공식 RFC 5322 표준은 매우 복잡합니다. 프로덕션 사용을 위해서는 전용 이메일 검증 라이브러리 사용을 고려하세요.
전화번호
선택적 국가 코드와 다양한 형식을 가진 미국 전화번호:
^(\+1[-.\s]?)?(\(?\d{3}\)?[-.\s]?)?\d{3}[-.\s]?\d{4}$
다음과 같은 형식과 일치합니다:
- 555-123-4567
- (555) 123-4567
- +1 555 123 4567
- 5551234567
URL
선택적 www 접두사가 있는 HTTP 및 HTTPS URL 일치:
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$
IP 주소
IPv4 주소 검증:
^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
이것은 각 옥텟이 0에서 255 사이인지 확인합니다.
날짜
ISO 8601 날짜 형식 (YYYY-MM-DD):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
미국 날짜 형식 (MM/DD/YYYY):
^(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])\/\d{4}$
신용카드 번호
기본 신용카드 검증 (공백과 대시 제거):
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
이 패턴은 Visa, MasterCard, American Express 및 Discover 카드를 검증합니다. 실제 검증을 위해서는 항상 Luhn 알고리즘을 사용하세요.
비밀번호
최소 8자, 대문자 1개, 소문자 1개, 숫자 1개 및 특수 문자 1개가 필요한 강력한 비밀번호:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
이것은 전방탐색 어설션(다음 섹션에서 다룸)을 사용하여 모든 요구 사항이 충족되는지 확인합니다.
앵커, 그룹 및 전방탐색
이러한 고급 기능은 일치가 발생하는 위치와 패턴이 캡처되는 방법을 정밀하게 제어할 수 있게 해줍니다.
앵커
앵커는 문자와 일치하지 않고 문자열의 위치와 일치합니다:
^— 문자열의 시작 (또는 다중 줄 모드에서 줄의 시작)$— 문자열의 끝 (또는 다중 줄 모드에서 줄의 끝)\b— 단어 경계 (\w와 \W 사이)\B— 단어 경계가 아닌 곳\A— 문자열의 시작 (다중 줄 모드에서도 항상)\Z— 문자열의 끝 (다중 줄 모드에서도 항상)
예제: \bcat\b는 전체 단어로서 "cat"과 일치하지만 "category"나 "concatenate"의 "cat"과는 일치하지 않습니다.
캡처 그룹
괄호는 일치하는 부분 문자열을 추출하는 캡처 그룹을 만듭니다:
^(\d{3})-(\d{3})-(\d{4})$
이 패턴은 전화번호와 일치하고 지역 코드, 접두사 및 회선 번호를 개별적으로 캡처합니다. 이러한 캡처를 대체 문자열에서 참조하거나 프로그래밍 방식으로 추출할 수 있습니다.
비캡처 그룹
그룹화가 필요하지만 일치를 캡처하고 싶지 않을 때 (?:...)를 사용하세요:
(?:https?|ftp)://[^\s]+
이것은 http, https 또는 ftp로 시작하는 URL과 일치하지만 프로토콜에 대한 캡처 그룹을 만들지 않습니다.
명명된 캡처 그룹
명명된 그룹은 정규표현식을 더 읽기 쉽고 유지 관리하기 쉽게 만듭니다:
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
번호 대신 이름으로 이것들을 참조할 수 있어 코드가 더 명확해집니다.
전방탐색 어설션
전방탐색은 문자를 소비하지 않고 앞에 패턴이 존재하는지 확인합니다:
(?=...)— 긍정 전방탐색 (뒤에 있어야 함)(?!...)— 부정 전방탐색 (뒤에 없어야 함)
예제: \d+(?= dollars)는 " dollars"가 뒤따르는 숫자와 일치하지만 일치에 " dollars"를 포함하지 않습니다.
후방탐색 어설션
후방탐색은 현재 위치 앞에 무엇이 오는지 확인합니다:
(?<=...)— 긍정 후방탐색 (앞에 있어야 함)(?<!...)— 부정 후방탐색 (앞에 없어야 함)
예제: (?<=\$)\d+는 달러 기호가 앞에 있는 숫자와 일치하지만 일치에 $를 포함하지 않습니다.
JavaScript는 ES2018에서만 후방탐색 지원을 얻었으므로 이전 브라우저를 지원하는 경우 호환성을 확인하세요.
JavaScript에서의 정규표현식
JavaScript는 RegExp 객체와 문자열 메서드를 통해 강력한 정규표현식 지원을 제공합니다. JavaScript 애플리케이션에서 정규표현식을 효과적으로 사용하는 방법은 다음과 같습니다.
정규표현식 패턴 생성
정규표현식 패턴을 두 가지 방법으로 만들 수 있습니다:
// 리터럴 표기법 (정적 패턴에 선호됨)
const pattern1 = /\d{3}-\d{3}-\d{4}/;
// 생성자 (동적 패턴에 유용함)
const pattern2 = new RegExp('\\d{3}-\\d{3}-\\d{4}');
생성자의 이중 백슬래시에 주목하세요 — 문자열에서 백슬래시를 이스케이프해야 합니다.
정규표현식 플래그
JavaScript는 정규표현식 동작을 수정하는 여러 플래그를 지원합니다: