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

Possessive Quantifier 재방문

~6 min · possessive, quantifier

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

Possessive vs atomic — 같은 아이디어

Possessive quantifier (*+, ++, ?+, {n,m}+) 와 atomic 그룹이 같은 거 — backtracking 비활성화 — 다른 문법으로.

a++(?>a+) 와 등가. 둘 다 한 번 소비한 글자 돌려주기 거부.

어느 거 사용

Possessive: 단일 quantifier 에 no-backtrack 룰 적용 시. \d++, \w*+.

Atomic 그룹: 멀티 요소 패턴 wrap 하고 전체 lock 원할 때. (?>\d{3}-\d{4}) 가 대시와 숫자의 다른 split 으로 backtrack X.

엔진 지원 비교

엔진AtomicPossessive
Python re 3.11+
Python regex
PCRE / PHP
Java
Ruby✓ (1.9+)
.NET
JavaScript
RE2/Go

Portable workaround

본인 엔진이 둘 다 없으면 (특히 JavaScript) workaround 가 backtracking 필요 없게 패턴 리팩토. Negated character class (.+?X 대신 [^X]+) 또는 anchor 된 alternation. 종종 패턴 더 빠름 AND 더 가독.

Code

Possessive 등가·python
import sys
import re

if sys.version_info >= (3, 11):
    # Possessive
    re.search(r'\d++X', 'aaa')   # 빠르게 실패 — \d 어차피 매칭 X

    # Atomic 등가
    re.search(r'(?>\d+)X', 'aaa')

    # 둘 다 backtracking 폭발 보호
    # re.search(r'\d+X', '9'*30 + 'Y')  # backtracking 으로 더 느림
    # re.search(r'\d++X', '9'*30 + 'Y')  # 즉시 실패

# Portable workaround: .+? 대신 negated character class
# 나쁨 (greedy + backtrack)
re.search(r'".*?"', '"hello" world')

# 더 좋음 (backtrack 불가)
re.search(r'"[^"]*"', '"hello" world')

# 이게 모든 엔진 (JavaScript 와 RE2 포함) 에서 동작

External links

Exercise

.+? 있는 패턴 잡고 X 가 자연 구분자인 [^X]* 로 다시 작성. 긴 문자열에 둘 다 시간 측정. Negated class 버전이 최소 같은 속도, 종종 더 빠르고, atomic 그룹 없는 엔진에 portable.

Progress

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

댓글 0

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

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