Skip to content

Instantly share code, notes, and snippets.

@mibmo
Created April 30, 2025 16:52
Show Gist options
  • Save mibmo/458adf7c52e8ea0c0d6c05d8a6116927 to your computer and use it in GitHub Desktop.
Save mibmo/458adf7c52e8ea0c0d6c05d8a6116927 to your computer and use it in GitHub Desktop.
Semver regex via Nix
let
letter = ''[a-zA-Z]''; # unused; just from semver's spec
positive-digit = ''[1-9]'';
digit = ''[0-9]'';
non-digit = ''[a-zA-Z-]'';
identifier-character = ''[a-zA-Z0-9-]'';
numeric-identifier = ''(0|${positive-digit}${digit}*)'';
alphanumeric-identifier = ''(${non-digit}${identifier-character}*|${identifier-character}+${non-digit}${identifier-character}*)'';
build-identifier = ''(${alphanumeric-identifier}|${digit}+)'';
pre-release-identifier = ''(${alphanumeric-identifier}|${numeric-identifier})'';
dot-separated-build-identifiers = ''${build-identifier}(\.${build-identifier})*'';
build = dot-separated-build-identifiers;
dot-separated-pre-release-identifiers = ''${pre-release-identifier}(\.${pre-release-identifier})*'';
pre-release = dot-separated-pre-release-identifiers;
patch = numeric-identifier;
minor = numeric-identifier;
major = numeric-identifier;
version-core = ''${major}\.${minor}\.${patch}'';
valid-semver = ''${version-core}(-${pre-release})?(\+${build})?'';
in
valid-semver
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment