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
    }