정규 표현식

정규 표현식 (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 Thompsonedgrep에 사용된 정규 표현식 엔진을 구현, 이후 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)
데이터베이스 LIKEREGEXP 연산자로 문자열 검색 (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. 참고 문헌 및 자료

  1. Friedl, Jeffrey. Mastering Regular Expressions. 3rd ed., O'Reilly Media, 2006.
  2. POSIX.1-2008. Regular Expression (IEEE Std 1003.1, 2008).
  3. Perl Documentation. perlreref, perlre.
  4. Unicode Consortium. UAX #18: Unicode Regular Expressions.
  5. K. Thompson. Regular expression search algorithm. Communications of the ACM, 1977.
  6. ECMA International. ECMAScript Language Specification (ECMA‑262).

정규 표현식은 텍스트 처리의 근본적인 도구로, 올바른 이해와 안전한 적용이 소프트웨어 품질과 보안에 크게 기여한다.

둘러보기

더 찾아볼 만한 주제