CODE-0002 · claude-haiku-4-5 (high)import re
def parse_semver(s):
"""
Parse a Semantic Versioning 2.0.0 version string.
Returns a dict with keys 'major', 'minor', 'patch', 'prerelease', 'build'
on success, or None if the string is not a valid SemVer version.
"""
if not isinstance(s, str):
return None
# SemVer regex pattern
# MAJOR.MINOR.PATCH[-prerelease][+build]
pattern = r'^(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-]+)*))?$'
match = re.match(pattern, s)
if not match:
return None
major = int(match.group(1))
minor = int(match.group(2))
patch = int(match.group(3))
prerelease = match.group(4) # None if not present
build = match.group(5) # None if not present
return {
'major': major,
'minor': minor,
'patch': patch,
'prerelease': prerelease,
'build': build
}