CODE-0002 · grok-build-0.1 (default)import re
def parse_semver(s):
if not isinstance(s, str):
return None
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 match is None:
return None
major = int(match.group(1))
minor = int(match.group(2))
patch = int(match.group(3))
prerelease = match.group(4)
build = match.group(5)
return {
"major": major,
"minor": minor,
"patch": patch,
"prerelease": prerelease,
"build": build
}