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

Branch Reset 그룹 — (?|...)

~6 min · branch-reset, pcre, advanced

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

대안 가로질러 캡처 번호 평탄화

보통 그룹 안 alternation 이 안 그룹 가지면 각 대안에 자기 그룹 번호 줘. (a(b)c|d(e)f) 가 그룹 1 (전체), 2 (b), 3 (e). 'b' 와 'e' 가 대안인데 별개 번호.

Branch reset 그룹 (?|...) 가 각 대안 위해 번호 reset. (?|a(b)c|d(e)f) — 그룹 1 이 'b' OR 'e', 어느 거든 매칭한 거. "매칭한 분기의 안 부분" 원하면 더 깨끗.

사용 케이스

N 대안 패턴 가지고 각각의 의미 있는 부분에 단일 캡처 슬롯 원할 때. Branch reset 없으면 N 캡처 슬롯, 한 개만 채워짐, non-None 인 거 찾으려 walk.

엔진 지원

PCRE 와 Perl. Python third-party regex 모듈. 내장 re, JavaScript, .NET, Go 에 X.

Portable workaround

Branch reset 없으면 다른 대안에 같은 이름의 named 그룹 사용. PCRE 가 허용; Python regex 모듈도. 내장 re 가 중복 이름 거부. 이거 필요하고 내장 re 에 갇혔으면 post-process: 첫 non-None 그룹 선택.

Code

Branch reset 그룹·text
# PCRE / PHP 에서
// preg_match('/(?|a(b)c|d(e)f)/', 'def', $m)
// $m[1] = 'e'  — 평탄 캡처, 어느 대안 매칭이든

# Python third-party 'regex' 모듈
import regex
m = regex.match(r'(?|a(b)c|d(e)f)', 'def')
m.group(1)  # 'e'

# 내장 Python 're' workaround — 별개 그룹 alternation
import re
m = re.match(r'(?:a(b)c|d(e)f)', 'def')
# m.group(1) 가 None (b 매칭 X)
# m.group(2) 가 'e'
# 첫 non-None 선택
result = next(g for g in m.groups() if g is not None)
print(result)  # 'e'

External links

Exercise

각각 안 캡처 가진 여러 대안의 패턴 잡기 (예: 여러 포맷 중 하나에서 값 추출). Branch reset 없이 non-None 찾으려 그룹 walk. 있으면 슬롯 하나. 본인 코드베이스 스타일에 맞는 접근 결정.

Progress

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

댓글 0

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

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