정규 표현식 (Regular Expression, 줄여서 regex) 은 문자열에서 특정한 패턴을 찾거나, 그 패턴에 따라 문자열을 변환·검증하는 데 사용되는 형식 언어이다. 컴퓨터 과학 및 텍스트 처리 분야에서 광범위하게 활용되며, 프로그래밍 언어, 텍스트 편집기, 데이터베이스, 검색 엔진 등 거의 모든 소프트웨어 시스템에 내장된 기능이다.
1. 정의
정규 표현식은 문자 집합과 연산자를 조합해 패턴을 기술한다.
- 리터럴: 그대로 매치되는 문자(예:
a, 1)
- 메타문자: 특수 의미를 갖는 문자(예:
.(임의의 한 문자), *(0회 이상 반복), +(1회 이상 반복), ?(0·1회), |(OR), ()(그룹화))
- 이스케이프: 메타문자를 일반 문자로 취급(
\.)
정규 표현식은 일치 여부(매치), 검색(search), 대체(replace), 분할(split) 등 다양한 연산에 사용된다.
2. 역사
| 연도 |
사건 |
| 1950∼1960년대 |
스티븐 콜레어(Stephen Cole)와 마이클 레오프스키(Michael O. Leff) 등 초기 형태의 패턴 매칭 기법 연구 |
| 1968 |
슈퍼레퍼런스(RegEx) 개념이 MIT에서 개발된 QED 편집기와 UNIX ed 편집기에 도입 |
| 1977 |
Ken Thompson이 ed와 grep에 사용된 정규 표현식 엔진을 구현, 이후 POSIX 표준에 큰 영향을 미침 |
| 1987 |
Perl이 강력한 정규 표현식 기능을 도입, 현대 정규 표현식의 대부분 문법이 정립 |
| 1990 ∼ 현재 |
POSIX, ECMA-262 (JavaScript), Unicode Technical Standard #18 등 국제 표준化 진행, 다양한 언어·라이브러리에서 구현 |
3. 주요 구성요소와 문법
| 구분 |
예시 |
의미 |
| 문자 집합 |
[abc], [^0-9] |
지정한 문자 중 하나와 매치 또는 부정 |
| 반복 |
a*, b+, c{3,5} |
0·무한, 1·무한, 최소‑최대 횟수 반복 |
| 앵커 |
^, $, \b |
문자열 시작·끝, 단어 경계 등 위치 지정 |
| 그룹화 |
(ab)+, (?<name>…) |
서브패턴을 묶어 캡처·참조 가능 |
| 선택 |
`cat |
dog |
| 전방·후방 탐색 |
(?=… ), (?<=… ) |
매치 전후 조건 지정(긍정·부정) |
| 이스케이프 |
\d, \w, \s, \Q…\E |
미리 정의된 문자 클래스·리터럴 처리 |
| 유니코드 |
\p{Han}, \u{AC00} |
유니코드 속성·코드 포인트 매칭 |
4. 표준화
| 표준 |
주요 내용 |
적용 예 |
| POSIX BRE/ERE |
기본·확장 정규 표현식, grep, sed 등에서 사용 |
`grep -E 'a(b |
| Perl 호환 (PCRE) |
Perl 스타일의 고급 기능(후방 탐색, 조건부 패턴 등) |
preg_match('/(?<=\d{3})\w+/', $s) |
| ECMAScript (JavaScript) |
RegExp 객체, /.../ 리터럴 |
/^\d{4}-\d{2}-\d{2}$/ |
| Unicode Technical Standard #18 |
유니코드 문자 속성 매칭, \p{...} |
/\p{Emoji}/u |
| .NET |
.NET Regex 클래스, (?<name>…) 명명된 캡처 |
Regex.IsMatch(text, @"^(?<year>\d{4})") |
5. 주요 구현체·라이브러리
| 언어/플랫폼 |
라이브러리·함수 |
특징 |
| C/C++ |
PCRE, Boost.Regex, std::regex (C++11) |
고성능, POSIX 및 Perl 호환 |
| Python |
re 모듈, regex 서드파티 |
Unicode 지원, 명명된 캡처, 비동기 검색 |
| Java |
java.util.regex |
Java 1.4 이후 표준, Unicode aware |
| JavaScript |
RegExp 객체 |
ECMA‑262 표준, 전역·다중 플래그 (g, i, m, u) |
| .NET |
System.Text.RegularExpressions |
.NET 전용 최적화, 명명된 캡처, 시간 제한 |
| Ruby |
Regexp 클래스 |
문자 집합, 백레퍼런스, 멀티라인 옵션 |
| PHP |
preg_* 함수들 |
PCRE 기반, preg_match, preg_replace 등 |
| Go |
regexp 패키지 |
RE2 엔진 사용, 무한 반복 제한을 통한 보안 |
6. 활용 사례
| 분야 |
구체적 활용 예 |
| 텍스트 편집 |
파일 내 특정 패턴 찾아 교체 (예: sed 's/^\s+//g') |
| 데이터 검증 |
이메일, 전화번호, 주민등록번호 형식 검증 |
| 로그 분석 |
로그 라인에서 IP, 시간, 에러 코드 추출 |
| 웹 크롤링 |
HTML 페이지에서 URL, 메타데이터 추출 |
| 보안 |
입력값 필터링, XSS/SQL Injection 방어 (패턴 기반 차단) |
| 자연어 처리 |
토큰화, 형태소 추출, 정규화 작업 |
| IDE/코드 하이라이팅 |
구문 강조를 위한 언어 정의 파일 (예: TextMate, VSCode) |
| 데이터베이스 |
LIKE와 REGEXP 연산자로 문자열 검색 (MySQL, PostgreSQL) |
7. 장점과 한계
| 장점 |
한계 |
| 표현력 – 복잡한 패턴을 간결히 기술 가능 |
가독성 – 복잡한 식은 읽고 유지보수 어려움 |
| 범용성 – 거의 모든 언어·툴이 지원 |
성능 – 비효율적인 패턴(특히 백트래킹)은 급격히 느려질 수 있음 |
| 표준화 – POSIX·PCRE 등 국제 표준 존재 |
보안 – 부정확한 사용 시 ReDoS(정규식 거부 서비스) 위험 |
| 유니코드 지원 – 최신 엔진은 다국어 처리 가능 |
제한된 문맥 – 정규 표현식은 정규 언어(문맥 자유 언어)만 처리, 중첩 구조(예: 중첩 괄호) 표현 어려움 |
| 다양한 옵션 – 전방·후방 탐색, 조건부, 명명된 캡처 등 |
학습 곡선 – 메타문자와 플래그 조합을 완전히 익히기 어려움 |
8. 관련 용어
- 패턴 매칭(Pattern Matching) – 정규 표현식이 수행하는 기본 연산
- 문자 클래스(Character Class) –
[...] 형태의 문자 집합
- 백레퍼런스(Backreference) – 이전에 매치된 캡처 그룹을 재참조 (
\1, \k<name>)
- 컴파일(Compilation) – 정규 표현식을 내부 상태 머신(예: NFA/DFA)으로 변환하는 과정
- ReDoS (Regular Expression Denial of Service) – 악의적인 패턴을 이용해 엔진을 과부하시키는 공격
9. 참고 문헌 및 자료
- Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O'Reilly Media, 2006.
- POSIX.1-2008. Regular Expression (IEEE Std 1003.1, 2008).
- Perl Documentation. perlreref, perlre.
- Unicode Consortium. UAX #18: Unicode Regular Expressions.
- K. Thompson. Regular expression search algorithm. Communications of the ACM, 1977.
- ECMA International. ECMAScript Language Specification (ECMA‑262).
정규 표현식은 텍스트 처리의 근본적인 도구로, 올바른 이해와 안전한 적용이 소프트웨어 품질과 보안에 크게 기여한다.