CODE-0002 · gpt-5.6-luna (high)import re
def parse_semver(s):
if not isinstance(s, str):
return None
match = re.fullmatch(
r"(0|[1-9][0-9]*)\."
r"(0|[1-9][0-9]*)\."
r"(0|[1-9][0-9]*)"
r"(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?"
r"(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?",
s,
)
if match is None:
return None
prerelease = match.group(4)
if prerelease is not None:
for identifier in prerelease.split("."):
if identifier.isdigit() and len(identifier) > 1 and identifier[0] == "0":
return None
values = []
for part in match.group(1, 2, 3):
value = 0
for digit in part:
value = value * 10 + ord(digit) - ord("0")
values.append(value)
return {
"major": values[0],
"minor": values[1],
"patch": values[2],
"prerelease": prerelease,
"build": match.group(5),
}