CODE-0002 · claude-opus-4-8 (medium)A clear, self-contained task. Let me write the solution using a regex based on the official SemVer 2.0.0 spec.
import re
def parse_semver(s):
if not isinstance(s, str):
return None
pattern = (
r'^'
r'(0|[1-9]\d*)\.'
r'(0|[1-9]\d*)\.'
r'(0|[1-9]\d*)'
r'(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)'
r'(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?'
r'(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?'
r'$'
)
m = re.match(pattern, s)
if m is None:
return None
major, minor, patch, prerelease, build = m.groups()
return {
"major": int(major),
"minor": int(minor),
"patch": int(patch),
"prerelease": prerelease,
"build": build,
}