사람을 위한 정규 표현식: 실용 가이드
정규 표현식(regex)은 평판이 좋지 않습니다. 누군가 키보드 위에서 잠든 것처럼 보입니다: ^[\w.-]+@[\w-]+\.[\w.]+$. 코드 리뷰, 텍스트 편집기, 검색 도구, 양식 유효성 검사에 등장합니다. 개발자들은 이를 사랑하거나 완전히 피합니다.
진실은 그 중간에 있습니다. 정규 표현식은 정말 강력합니다. 처음에는 정말 혼란스럽기도 합니다. 하지만 실용적인 가치를 얻기 위해 모든 생소한 기능을 마스터할 필요는 없습니다. 몇 가지 패턴만으로 실제 사용 사례의 대부분을 커버할 수 있습니다.
정규 표현식이 실제로 하는 일
정규 표현식은 문자열 집합을 설명하는 패턴입니다. 검색 도구에 제공하면 패턴에 일치하는 모든 문자열을 찾습니다. 매우 정밀한 검색 쿼리라고 생각하세요.
일반 검색: 정확히 "hello"를 찾기 정규 표현식 검색: 이메일 주소, 전화번호, 날짜, URL, 또는 설명할 수 있는 모든 패턴과 비슷한 것을 찾기.
알고 계셨나요? 정규 표현식은 1956년 수학자 Stephen Kleene이 형식 언어 이론에서 "정규 언어"를 설명하기 위한 표기법으로 발명했습니다. 1960년대와 1970년대 초기 Unix 텍스트 편집기를 통해 컴퓨팅에 도입되었습니다.
구성 요소
리터럴 문자
가장 간단한 정규 표현식은 그냥 리터럴 텍스트입니다. 패턴 hello는 문자열 "hello"와 일치합니다. 특별한 것 없습니다.
점 (.) — 임의의 단일 문자
점은 줄바꿈을 제외한 임의의 단일 문자와 일치합니다.
h.t는 "hat", "hit", "hot", "hut", 심지어 "h3t"와도 일치
문자 클래스 ([]) — 특정 문자
대괄호는 해당 위치에서 허용되는 문자 집합을 정의합니다.
[aeiou]는 임의의 단일 모음과 일치[0-9]는 임의의 숫자와 일치[A-Za-z]는 임의의 문자(대소문자)와 일치[^0-9]는 숫자가 아닌 임의의 문자와 일치 (대괄호 안의^는 "아닌"을 의미)
수량자 — 몇 개
이 기호들은 반복을 제어합니다:
| 기호 | 의미 | 예제 | 일치 |
|---|---|---|---|
* |
0개 이상 | ab*c |
"ac", "abc", "abbc", "abbbc" |
+ |
1개 이상 | ab+c |
"abc", "abbc", "abbbc" ("ac" 제외) |
? |
0개 또는 1개 | colou?r |
"color"와 "colour" |
{3} |
정확히 3개 | a{3} |
"aaa" |
{2,4} |
2~4개 | a{2,4} |
"aa", "aaa", "aaaa" |
앵커 — 위치
^는 시작 부분에서 "문자열의 시작"을 의미$는 끝 부분에서 "문자열의 끝"을 의미^hello$는 정확히 문자열 "hello"만 일치하며 "say hello"나 "hello world"와는 일치하지 않음
축약 클래스
일반적인 문자 클래스에는 축약형이 있습니다:
| 축약 | 동등 | 의미 |
|---|---|---|
\d |
[0-9] |
임의의 숫자 |
\w |
[A-Za-z0-9_] |
임의의 "단어" 문자 |
\s |
[ \t\n\r] |
임의의 공백 |
\D |
[^0-9] |
숫자가 아닌 문자 |
\W |
[^A-Za-z0-9_] |
단어 문자가 아닌 문자 |
\S |
[^ \t\n\r] |
공백이 아닌 문자 |
그룹 (()) — 그룹화 및 캡처
괄호는 패턴의 일부를 그룹화합니다. 그룹에 수량자를 적용하거나 일치의 특정 부분을 추출하는 데 유용합니다.
(ab)+는 "ab", "abab", "ababab"과 일치(\d{3})-(\d{4})는 "555-1234"와 일치하고 "555"와 "1234"를 별도로 캡처
파이프 (|) — 또는
파이프는 "또는"을 의미합니다.
cat|dog는 "cat" 또는 "dog"과 일치(jpg|png|gif)는 이 세 가지 이미지 확장자 중 하나와 일치
오늘 바로 사용할 수 있는 실용 패턴
이메일 주소 일치 (간단)
[\w.-]+@[\w-]+\.[\w.]+
분해:
[\w.-]+— 하나 이상의 단어 문자, 점, 또는 하이픈 (로컬 파트)@— 리터럴 @ 기호[\w-]+— 하나 이상의 단어 문자 또는 하이픈 (도메인)\.— 리터럴 점 (.이 특수 문자이므로 이스케이프)[\w.]+— 하나 이상의 단어 문자 또는 점 (TLD)
주의 정규 표현식으로 이메일 유효성 검사를 완벽하게 하기는 매우 어렵습니다. 위의 간단한 패턴은 실제 이메일 주소의 99%를 커버하지만 RFC 규격에 정의된 모든 엣지 케이스를 처리하지는 않습니다. 프로덕션 유효성 검사에는 프로그래밍 언어의 이메일 유효성 검사 라이브러리를 사용하세요.
전화번호 일치 (미국 형식)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
일치 대상:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
URL 일치
https?://[\w.-]+(/[\w./-]*)?
일치 대상:
날짜 일치 (YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
일치 대상: 2026-03-23, 1999-12-31 등.
중복 단어 찾기
\b(\w+)\s+\1\b
"the the"나 "is is" 같은 반복 단어와 일치합니다. \1은 첫 번째 그룹에서 캡처된 것을 다시 참조합니다.
IPv4 주소 일치
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
192.168.1.1이나 10.0.0.255 같은 패턴과 일치합니다.
정규 표현식 작성 팁
1. 간단하게 시작하고 개선하기
첫 시도에서 완벽한 정규 표현식을 작성하려고 하지 마세요. 넓은 패턴으로 시작하고, 데이터에 대해 테스트하고, 조여 나가세요.
2. 항상 테스트하기
정규 표현식은 틀리기 쉽습니다. 빠진 수량자나 이스케이프되지 않은 점 하나가 일치하는 것을 완전히 바꿀 수 있습니다. 프로덕션에서 사용하기 전에 항상 실제 데이터에 대해 패턴을 테스트하세요.
3. 특수 문자 이스케이프
리터럴 점, 괄호, 대괄호 또는 다른 특수 문자를 일치시켜야 한다면 백슬래시로 이스케이프하세요: \., \(, \[.
4. 주석과 명명된 그룹 사용
복잡한 패턴에서는 명명된 그룹과 주석(지원되는 경우)을 사용하여 정규 표현식을 읽기 쉽게 만드세요. 미래의 자신이 감사할 것입니다.
5. 정규 표현식을 사용하지 말아야 할 때 알기
정규 표현식은 HTML, XML, JSON 또는 중첩 구조를 파싱하는 데 적합하지 않습니다. 이런 것들에는 적절한 파서를 사용하세요.
팁 실시간으로 정규 표현식 패턴을 테스트하고 디버그하세요: 정규 표현식 패턴 테스트 방법. 패턴과 테스트 데이터를 붙여넣으면 일치가 즉시 강조 표시됩니다.
지금 바로 정규 표현식 테스트를 시작하세요:
무료, 즉각적인 피드백, 가입 불필요.