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

엔진 차이 — 전후방 탐색 깨지는 자리

~8 min · flavors, compatibility

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

전후방 탐색 지원은 엔진마다 크게 달라

전방 탐색은 많은 백트래킹 엔진에서 지원하지만 RE2와 Go, ripgrep 기본 엔진에서는 사용할 수 없어. 후방 탐색은 지원 범위가 더 좁고, 가변 길이까지 허용하는지는 엔진과 버전에 따라 달라.

엔진전방 탐색후방 탐색가변 길이 후방 탐색
Python re✗ (컴파일 오류)
Python regex
JavaScript✓ (ES2018)✓ (ES2018)
PCRE210.43+ 제한적 지원
Java최대 길이가 제한된 경우 지원
.NET
Go regexp / RE2
ripgrep 기본 엔진
ripgrep --pcre2버전에 따라 제한적 지원

호환성이 중요할 때

여러 언어나 RE2 기반 서비스에서 같은 패턴을 써야 한다면 전후방 탐색 대신 앵커, 캡처 그룹, 후처리를 선택해. 한 엔진에 고정된 코드라면 실제 배포 버전의 지원 범위를 확인한 뒤 전후방 탐색을 써.

테스터의 엔진도 맞춰

regex101에서 성공한 패턴이 실제 런타임에서는 실패할 수 있어. PCRE2, Python, ECMAScript 가운데 배포 환경과 같은 엔진을 선택하고, Go나 RE2라면 전후방 탐색 없는 대안도 함께 시험해.

Code

같은 문제, 다른 엔진·text
# 목표: '$' 앞에 오는 숫자 추출하되 '$' 자체는 스킵

# Python re — 동작
import re
re.findall(r'(?<=\$)\d+', 'paid $19 not 20 but $5')
# ['19', '5']

# JavaScript ES2018+ — 동작
// 'paid $19 not 20 but $5'.match(/(?<=\$)\d+/g)
// ['19', '5']

# Go — 동작하지 않음, regexp.MustCompile panic
// regexp.MustCompile(`(?<=\$)\d+`)  // panic: error parsing regexp

# Go workaround — 캡처 후 후처리
// re := regexp.MustCompile(`\$(\d+)`)
// matches := re.FindAllStringSubmatch(s, -1)
// for _, m := range matches { fmt.Println(m[1]) }  // m[1] 이 숫자만

External links

Exercise

작성한 전후방 탐색 패턴 하나를 regex101의 PCRE2, Python, ECMAScript 엔진에서 각각 시험해. 같은 결과가 나는지, 플래그가 필요한지, 컴파일이 실패하는지를 기록하고 엔진마다 패턴을 다시 쓸지 요구 엔진을 문서화할지 결정해.

Progress

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

댓글 0

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

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