가장 단순한 버전 모양은 세 숫자 묶음이야
시맨틱 버전의 중심은 MAJOR.MINOR.PATCH 형식이야.
^[0-9]+\.[0-9]+\.[0-9]+$
이 패턴은 점으로 이은 ASCII 숫자 세 묶음을 요구해서 1.0.0은 받아들이고 1.0은 거부해. 다만 선행 0을 비롯한 SemVer의 모든 규칙까지 검사하지는 않아.
정식 SemVer에는 사전 릴리스와 빌드 정보도 있어
1.0.0-alpha, 1.0.0-rc.1 같은 사전 릴리스와 1.0.0+build.123 같은 빌드 메타데이터까지 포함하면 패턴이 길어져.
^(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-]+)*))?$
이 패턴을 외우지 말고 SemVer 명세의 최신 권장 표현을 확인해. 단순 검색이라면 짧은 패턴으로 충분하고, 명세 준수 검증이라면 검증된 라이브러리가 더 안전해.
필요한 엄격함을 먼저 정해
문서에서 버전처럼 보이는 문자열만 찾는다면 [0-9]+\.[0-9]+\.[0-9]+로 시작할 수 있어. 패키지 게시나 의존성 해석처럼 의미가 중요한 자리에서는 전체 규칙을 적용해야 해.
버전의 크기는 정규식으로 비교하지 마
숫자와 사전 릴리스 규칙을 해석하는 일은 Python의 packaging.version.parse, Node의 SemVer 패키지, Go의 golang.org/x/mod/semver 같은 도구에 맡겨. 정규식은 조각을 찾을 수는 있어도 버전 우선순위 규칙을 대신하지 못해.