정규식 치트 시트: 일반적인 패턴 및 빠른 참조

· 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진수 숫자

사용자 정의 문자 클래스

대괄호 표현식 []을 사용하면 자신만의 문자 집합을 정의할 수 있습니다. 대괄호 내부에서는 대부분의 메타문자가 특별한 의미를 잃습니다—이스케이프할 필요가 없습니다.

빠른 팁: 문자 클래스 내 문자의 순서는 중요하지 않습니다. [abc][bca]는 동일합니다. 클래스는 문자 중 하나라도 있으면 일치합니다.

실용적인 예제

다음은 문자 클래스의 실제 사용 예입니다:

수량자와 반복

수량자는 패턴이 몇 번 반복되어야 하는지 지정합니다. 반복하려는 요소(문자, 문자 클래스 또는 그룹) 뒤에 배치됩니다.

수량자 의미 예제
* 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>를 고려해보세요:

수량자 뒤에 ?를 추가하면 게으른 (비탐욕적 또는 최소라고도 함) 매칭이 됩니다. 패턴이 여전히 성공할 수 있도록 하면서 가능한 한 적은 텍스트와 일치합니다.

프로 팁: 구분 기호(따옴표, 태그, 괄호) 사이의 내용을 추출할 때는 거의 항상 게으른 수량자를 사용하세요. ".*?" 패턴은 개별 따옴표 문자열을 올바르게 추출하지만, ".*"는 전체 텍스트에서 첫 번째 따옴표부터 마지막 따옴표까지 일치합니다.

일반적인 수량자 패턴

다음은 지속적으로 사용하게 될 패턴입니다:

앵커와 경계

앵커는 문자와 일치하지 않습니다—문자열의 위치와 일치합니다. 텍스트의 어디에서나가 아닌 특정 위치에서 패턴이 일치하도록 보장하는 데 필수적입니다.

앵커 위치 예제
^ 문자열의 시작 (또는 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 패턴을 고려해보세요:

이것은 \b를 더 큰 단어의 일부와 실수로 일치하지 않고 전체 단어를 찾는 데 완벽하게 만듭니다.

시작과 끝 앵커

^$ 앵커는 검증에 필수적입니다. 전체 문자열이 패턴과 일치하도록 보장하려면 (단지 포함하는 것이 아니라) 패턴을 이러한 앵커로 감싸세요.

빠른 팁: 사용자 입력(이메일, 전화번호, 사용자 이름)을 검증할 때는 항상 ^$를 사용하여 패턴을 고정하세요. 이것들이 없으면 \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) $2-$3와 같은 대체를 사용하여 "555-123-4567"을 "(555) 123-4567"로 변환할 수 있습니다.

비캡처 그룹

때로는 수량자나 교체를 위해 그룹화가 필요하지만 텍스트를 캡처할 필요는 없습니다. (?:..