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

조건 패턴 — (?(N)yes|no)

~8 min · conditional, advanced, pcre

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

그룹이 캡처했는지에 따라 다른 패턴 매칭

조건 패턴은 "group N 이 뭔가 캡처했으면 YES 분기, 아니면 NO 분기" 표현 가능. 문법: (?(N)yes|no), N 은 그룹 번호, named 그룹은 (?(name)yes|no).

이건 niche 하지만 강력한 기능. "여는 따옴표 있으면 일치하는 닫는 따옴표 요구; 아니면 따옴표 요구 없음" 같은 패턴 표현 방법.

예시: optional 괄호 쌍

패턴: (\()?\d+(?(1)\)) — "optional 여는 괄호, 그 다음 숫자, 그 다음 일치하는 닫는 괄호 — 여는 거 있을 때만."

  • 매칭 123 (괄호 없음, 둘 다 OK)
  • 매칭 (123) (열고 닫음)
  • 매칭 NO (123 또는 123) (불일치)

Flavor 지원

조건은 PCRE 기능, Python re, Perl, .NET, PHP, Ruby (Regexp::Engine 통해) 지원. JavaScript, Go, RE2 에 NO.

언제 손 뻗는가

솔직히 거의 안. 조건 이득 받는 패턴 대부분이 alternation 으로 더 깨끗: (?:\(\d+\)|\d+) 가 위 조건과 같은 거 매칭, 모든 flavor 에서 동작. YES 분기가 NO 분기보다 훨씬 복잡하고 중복 회피 원할 때만 조건.

Code

조건 패턴·python
import re

# 괄호 쌍: 열고 닫음 함께, 또는 둘 다 없음
pattern = r'(\()?\d+(?(1)\))'
bool(re.fullmatch(pattern, '123'))    # True
bool(re.fullmatch(pattern, '(123)'))  # True
bool(re.fullmatch(pattern, '(123'))   # False
bool(re.fullmatch(pattern, '123)'))   # False

# Named 그룹 조건
pattern = r'(?P<bracket>\()?\d+(?(bracket)\))'
bool(re.fullmatch(pattern, '(42)'))   # True

# 조건 없는 등가 — 보통 더 깨끗
pattern = r'\(\d+\)|\d+'
bool(re.fullmatch(pattern, '(42)'))   # True
bool(re.fullmatch(pattern, '42'))     # True

External links

Exercise

(415-555-0199) 처럼 괄호 완전 wrap 또는 415-555-0199 처럼 완전 bare 인 전화번호 매칭하는 패턴 — 한쪽 괄호만은 NO. Alternation 으로 풀고; 그 다음 조건으로 다시. 가독성 비교.

Progress

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

댓글 0

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

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