본문 바로가기
C.W.K.
Stream
Lesson 05 of 10 · published

정규식 엔진 방언 — 같은 아이디어, 다른 방언

~12 min · flavors, pcre, posix, ecmascript

Level 0패턴 호기심
0 XP0/90 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

한 정규식, 여러 구현체

정규식은 1950년대 이론 컴퓨터 과학에서 시작해 Unix를 거쳐 야생으로 나왔어. 이후 구현체마다 기능을 더하거나 빼면서 방언이 갈라졌지. 자주 만날 계열은 대략 넷이야.

PCRE(Perl-Compatible). 역참조, 전후방 탐색, 재귀, 소유적 수량자, 이름 붙은 그룹처럼 기능이 풍부한 계열이야. PHP와 PCRE2 사용 환경이 대표적이지. Python, Java, JavaScript, .NET도 비슷한 기능을 일부 제공하지만 PCRE와 같은 엔진은 아니야.

POSIX BRE / ERE. Unix의 오래된 계열이야. grep 기본은 BRE이고 egrepgrep -E는 ERE를 써. ERE는 그룹화할 때 백슬래시를 쓰지 않고 전후방 탐색도 없지만 호환성이 아주 높아.

ECMAScript / JavaScript. PCRE와 닮았지만 독특한 점이 있어. 소유적 수량자가 없고, gy 플래그는 lastIndex를 통해 상태를 기억해. 후방 탐색은 비교적 늦게 추가됐어.

RE2 / Go. 유한 오토마타 계열로 입력 길이에 비례해 끝나도록 설계됐어. 역참조와 전후방 탐색을 지원하지 않는 대신 파국적 백트래킹으로 인한 ReDoS를 피할 수 있지.

엔진 방언 차이가 무는 자리

실제로 쓸 기능의 80%는 어디서나 통해. 구현 차이가 드러나는 자리는 이쪽이야.

  • 후방 탐색 — 어떤 엔진은 고정 길이만 받고, 어떤 엔진은 가변 길이도 받아. RE2와 Go는 아예 지원하지 않아.
  • 이름 붙은 그룹 — Python은 (?P<name>...), .NET·PCRE·JavaScript는 (?<name>...) 형태를 써.
  • 역참조 — PCRE·Python·JavaScript는 지원하지만 RE2는 지원하지 않아.
  • 소유적 수량자*+, ++, ?+는 PCRE와 Python 3.11+에서 되지만 JavaScript에는 없어.
  • Unicode — Python의 \w는 기본적으로 Unicode를 인식해. JavaScript의 /u는 코드 포인트와 Unicode 속성 이스케이프를 올바르게 처리하지만 \w에 한글을 포함하지는 않아. grep 동작은 로캘과 구현에 따라 달라.

트랙 6에서는 도구별 차이를 더 자세히 비교해. 한 환경에서 되던 패턴이 다른 곳에서 실패하면 엔진과 버전, 플래그, 호스트 언어의 이스케이프부터 비교해.

Code

같은 패턴, 세 엔진 방언·bash
# PCRE / ripgrep / Python — 동작
rg '(?P<year>\d{4})-(?P<month>\d{2})' file.txt

# POSIX ERE / grep -E — 이름 붙은 그룹이 없어 번호 그룹으로 대체
grep -E '([0-9]{4})-([0-9]{2})' file.txt

# JavaScript — 이름 붙은 그룹 문법이 다름
// 'foo 2026-05'.match(/(?<year>\d{4})-(?<month>\d{2})/).groups
// { year: '2026', month: '05' }

External links

Exercise

직접 쓴 만만치 않은 패턴 하나를 골라 세 엔진에서 실행해 봐. ripgrep(rg 'PAT' file), Python(re.findall(r'PAT', text)), JavaScript('text'.match(/PAT/))를 쓰면 돼. 출력 차이를 메모해. 차이가 없다면 호환성이 높은 80% 안에 머문 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.