한 정규식, 여러 구현체
정규식은 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 차이가 첫 가설.