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

버전 번호 (Semver)

~6 min · semver, version, validation

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

Semver 모양

Semantic Versioning 이 대부분 소프트웨어 릴리스의 기반인 MAJOR.MINOR.PATCH 포맷. 기본 정규식:

^\d+\.\d+\.\d+$

점으로 join 된 숫자 부분 셋. 1.0.0 매칭; 1.0 매칭 X.

풀 semver 패턴

실제 semver 가 pre-release suffix (1.0.0-alpha, 1.0.0-rc.1) 와 build metadata (1.0.0+build.123) 허용. Semver spec 의 공식 정규식:

^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$

그래, 그게 공식. 그래, 외우지 말고 찾아봐. GitHub 의 semver spec README 가 있음.

Ad-hoc 사용엔

대부분 풀 semver 필요 X — "version-shape 매칭하는 거" 필요. 단순 \d+\.\d+\.\d+ 가 대부분 케이스 커버.

버전 비교

버전을 정규식으로 비교 X — 부분 추출 후 숫자로 비교. Python: packaging.version.parse. Node: semver npm 패키지. Go: 표준 라이브러리 처리.

Code

Semver 패턴·python
import re

# 단순
SEMVER = re.compile(r'^\d+\.\d+\.\d+$')
bool(SEMVER.fullmatch('1.0.0'))      # True
bool(SEMVER.fullmatch('1.0.0-rc'))   # False
bool(SEMVER.fullmatch('1.0'))        # False

# Optional v-prefix 있는 문자열에서 버전 추출
VERSION = re.compile(r'\bv?(\d+\.\d+\.\d+)(?:-([\w.]+))?(?:\+([\w.]+))?\b')
m = VERSION.search('release v2.3.1-beta.2 deployed')
print(m.group(1))  # '2.3.1'
print(m.group(2))  # 'beta.2'

# 비교엔 라이브러리
from packaging.version import Version

v1 = Version('1.10.0')
v2 = Version('1.9.0')
v1 > v2  # True (숫자, 문자열 X)

External links

Exercise

CHANGELOG 파일 잡기. 정규식으로 모든 버전 번호 추출. 라이브러리로 정렬. 정렬된 출력이 2.10.0 을 2.9.0 *후* 에 둬야 — 문자열 정렬이 실패할 자리.

Progress

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

댓글 0

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

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