프로그래밍을 하다 보면 텍스트를 처리해야 하는 순간들이 무수히 많습니다. 이메일 주소를 찾거나, 전화번호 형식을 검증하고, 특정 패턴의 문자열을 찾아 바꿔야 할 때마다 복잡한 조건문을 작성하고 계신가요? 정규표현식(Regular Expression)을 알고 있다면 이 모든 작업을 한 줄의 코드로 해결할 수 있습니다. 겉보기엔 암호 같아 보이지만, 한 번 익혀두면 텍스트 처리의 강력한 무기가 되는 정규표현식의 세계로 함께 떠나보세요.
정규표현식이란 무엇인가?

정규표현식은 문자열에서 특정 패턴을 찾거나 검증하기 위한 표현 방법입니다. 1950년대 수학자 스테판 콜 클린이 정규집합을 설명하기 위해 고안한 개념으로 시작되어, 현재는 거의 모든 프로그래밍 언어와 텍스트 에디터에서 지원하고 있습니다.
예를 들어 /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/라는 정규표현식은 이메일 주소 형식을 검증할 수 있습니다. 복잡해 보이지만, 각 부분이 특정한 의미를 가지고 있어 체계적으로 학습하면 충분히 이해할 수 있습니다.
정규표현식을 직접 테스트해보고 싶다면 정규식 테스터를 활용해보세요. 실시간으로 패턴을 확인할 수 있습니다.
기본 문법과 메타 문자

리터럴 문자와 메타 문자

정규표현식에서 대부분의 문자는 그 자체로 의미를 가집니다. 예를 들어 /cat/은 "cat"이라는 문자열을 찾습니다. 하지만 특별한 의미를 가진 메타 문자들이 있습니다:
- . (점): 개행 문자를 제외한 모든 문자 하나와 매치
- * (별표): 앞 문자가 0번 이상 반복
- + (플러스): 앞 문자가 1번 이상 반복
- ? (물음표): 앞 문자가 0번 또는 1번
- ^ (캐럿): 문자열의 시작
- $ (달러): 문자열의 끝
문자 클래스

대괄호 []를 사용해 문자의 범위나 집합을 정의할 수 있습니다:
- [abc]: a, b, c 중 하나와 매치
- [a-z]: 소문자 a부터 z까지
- [A-Z]: 대문자 A부터 Z까지
- [0-9]: 숫자 0부터 9까지
- [^abc]: a, b, c를 제외한 모든 문자
자주 사용되는 패턴들
숫자와 문자 패턴
정규표현식에는 자주 사용되는 패턴을 위한 단축 문자들이 있습니다:
- \d: 숫자 문자 (0-9)와 같음
- \w: 단어 문자 (알파벳, 숫자, 밑줄)
- \s: 공백 문자 (스페이스, 탭, 줄바꿈)
- \D: 숫자가 아닌 문자
- \W: 단어 문자가 아닌 문자
- \S: 공백이 아닌 문자
수량 지정자
중괄호를 사용해 더 정확한 반복 횟수를 지정할 수 있습니다:
- {n}: 정확히 n번 반복
- {n,}: n번 이상 반복
- {n,m}: n번 이상 m번 이하 반복
예를 들어, 한국의 휴대폰 번호 패턴은 /010-\d{4}-\d{4}/로 표현할 수 있습니다.
실전 예제로 배우는 정규표현식
이메일 주소 검증
가장 많이 사용되는 패턴 중 하나인 이메일 주소 검증을 단계별로 살펴보겠습니다:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- ^: 문자열의 시작
- [a-zA-Z0-9._%+-]+: 사용자 이름 부분 (영문자, 숫자, 특수문자 1개 이상)
- @: @ 문자 (리터럴)
- [a-zA-Z0-9.-]+: 도메인 이름 부분
- \.: 점 문자 (이스케이프)
- [a-zA-Z]{2,}: 최상위 도메인 (2글자 이상)
- $: 문자열의 끝
URL 패턴 매칭
웹 URL을 찾는 정규표현식도 자주 사용됩니다:
https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}([/?].*)?
여기서 https?는 'http' 또는 'https'를 의미하고, ?는 앞의 's'가 있을 수도 없을 수도 있음을 나타냅니다.
한국어 패턴
한국어 문자를 매칭하는 패턴도 만들 수 있습니다:
- [ㄱ-ㅎ]: 한글 자음
- [ㅏ-ㅣ]: 한글 모음
- [가-힣]: 완성된 한글 문자
그룹화와 캡처
괄호를 이용한 그룹화
괄호 ()를 사용하면 패턴의 일부를 그룹화할 수 있습니다. 이는 두 가지 목적으로 사용됩니다:
- 우선순위 지정: (abc)+는 'abc'를 하나의 단위로 취급
- 값 캡처: 매칭된 부분을 변수로 저장
예를 들어, 날짜 패턴에서 연도, 월, 일을 각각 캡처하려면:
(\d{4})-(\d{2})-(\d{2})
비캡처 그룹
그룹화는 하고 싶지만 값을 캡처하지 않으려면 (?:)를 사용합니다:
(?:https?|ftp)://[a-zA-Z0-9.-]+
플래그와 옵션
정규표현식의 동작을 제어하는 플래그들이 있습니다:
- i: 대소문자를 구분하지 않음 (case insensitive)
- g: 전역 검색 (모든 매치를 찾음)
- m: 다중 행 모드 (^과 $가 각 줄에 적용)
- s: 점(.)이 개행 문자도 매치
JavaScript에서는 /pattern/flags 형식으로 사용합니다. 예: /hello/gi
정규표현식은 강력하지만 복잡한 패턴은 성능에 영향을 줄 수 있습니다. 특히 중첩된 수량자나 백트래킹이 많은 패턴은 주의해서 사용하세요.
실무에서의 활용 팁
점진적 학습법
정규표현식을 처음 배울 때는 간단한 패턴부터 시작하세요:
- 리터럴 매칭부터 시작 (단순 문자열 찾기)
- 문자 클래스 익히기
- 수량자 추가하기
- 그룹화와 고급 기능 적용
디버깅과 테스트
정규표현식을 작성할 때는 반드시 다양한 테스트 케이스로 검증해야 합니다. 예상한 값뿐만 아니라 예상하지 못한 입력값도 테스트해보세요. 정규식 테스터 같은 도구를 활용하면 실시간으로 패턴의 동작을 확인할 수 있어 매우 유용합니다.
정규표현식은 처음엔 어려워 보이지만, 체계적으로 학습하면 텍스트 처리 작업을 혁신적으로 단순화할 수 있는 강력한 도구입니다. 복잡한 문자열 처리 로직을 한 줄로 해결하고, 데이터 검증과 추출 작업의 효율성을 크게 향상시킬 수 있습니다. 오늘부터 간단한 패턴부터 시작해서 점진적으로 실력을 쌓아가세요.
자주 묻는 질문
댓글 0개
첫 번째 댓글을 남겨보세요!