C.W.K.
Stream
Lesson 05 of 10 · published

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

~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) — 맥시멀리스트 패밀리. backreference, lookaround, recursion, possessive quantifier, named group. PHP, PCRE2 자체, 그리고 인기 언어 정규식 엔진 대부분이 사용 (Python 은 가깝지만 동일하진 않음).

POSIX BRE / ERE — Unix 구파. grep 기본은 BRE; egrep / grep -E 는 ERE. ERE 는 그룹화에 백슬래시 안 씀, lookaround 없음, 매우 portable.

ECMAScript / JavaScript — PCRE 에 가깝지만 quirk 있음 (possessive quantifier 없음, `g`/`y` flag 가 `lastIndex` 통해 stateful, lookbehind 는 최근 추가).

RE2 / Go — DFA 급. backreference 없음, 일반 lookaround 없음. 트레이드오프: O(n·m) 시간, ReDoS 면역.

Flavor 차이가 무는 자리

네가 쓸 80% 는 portable. flavor 가 갈리는 자리:

  • Lookbehind — 어떤 엔진은 fixed-width, 어떤 건 variable, RE2/Go 는 아예 없음.
  • Named group(?P<name>...) Python 식 vs (?<name>...) .NET/PCRE/JS 식.
  • Backreference — PCRE/Python/JS 동작, RE2 미지원.
  • Possessive quantifier*+, ++, ?+ PCRE 는 됨, JS 는 없음.
  • Unicode — Python 은 \w 가 기본 Unicode-aware; JavaScript 는 u 플래그 필요; grep 은 locale 의존.

Languages 트랙 (트랙 6) 에서 도구별로 명시 매핑해. 일단은 — 한 곳에서 되는 패턴이 다른 곳에서 안 되면 flavor 차이가 첫 가설.

Code

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

# POSIX ERE / grep -E — named group 없음, numbered fallback
grep -E '([0-9]{4})-([0-9]{2})' file.txt

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

External links

Exercise

본인이 쓴 non-trivial 패턴 하나 골라서 세 엔진에 돌려 봐: ripgrep (rg 'PAT' file), Python (re.findall(r'PAT', text)), JavaScript ('text'.match(/PAT/)). 출력 차이 메모. 차이 없으면 portable 80% 안에 머문 거.

Progress

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

댓글 0

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

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