Table of Contents

Build Number Extraction

SemVer provides helpers to extract a single numeric value from a pre-release or metadata string. This is useful when CI/CD systems embed a build counter in a pre-release tag (e.g. 1.0.0-rc.42) and you need that number programmatically.


BuildNumberFromPreRelease

Returns the build number embedded in the pre-release identifier.

SemVer.Parse("1.0.0-rc.42").BuildNumberFromPreRelease;   // 42
SemVer.Parse("1.0.0-alpha.1227").BuildNumberFromPreRelease; // 1227
SemVer.Parse("1.0.0-SNAPSHOT-7").BuildNumberFromPreRelease; // 7

Returns 0 when:

  • There is no pre-release identifier (PreRelease == null).
  • The pre-release contains no numeric sequence.
  • The pre-release contains more than one numeric sequence (ambiguous).
SemVer.Parse("1.0.0").BuildNumberFromPreRelease;          // 0 — no pre-release
SemVer.Parse("1.0.0-alpha").BuildNumberFromPreRelease;    // 0 — no number
SemVer.Parse("1.0.0-1.2.3").BuildNumberFromPreRelease;   // 0 — multiple numbers

BuildNumberFromMetadata

Identical behaviour, but reads from the metadata segment instead:

SemVer.Parse("1.0.0+build.99").BuildNumberFromMetadata;  // 99
SemVer.Parse("1.0.0+build.1").BuildNumberFromMetadata;   // 1

Returns 0 in the same edge cases as BuildNumberFromPreRelease.

SemVer.Parse("1.0.0").BuildNumberFromMetadata;           // 0 — no metadata
SemVer.Parse("1.0.0+sha.abc").BuildNumberFromMetadata;   // 0 — no number
SemVer.Parse("1.0.0+1.2").BuildNumberFromMetadata;       // 0 — multiple numbers

ExtractBuildNumber(string? input) — static helper

The static ExtractBuildNumber method applies the same extraction rules as both properties above, except that it throws instead of returning 0 when the number overflows (see the note below). You can call it directly on any arbitrary string:

SemVer.ExtractBuildNumber("rc.42");          // 42
SemVer.ExtractBuildNumber("alpha.123");      // 123
SemVer.ExtractBuildNumber("SNAPSHOT-12");    // 12
SemVer.ExtractBuildNumber("7");              // 7

SemVer.ExtractBuildNumber("beta");           // 0 — no number
SemVer.ExtractBuildNumber("alpha.beta");     // 0 — no number
SemVer.ExtractBuildNumber("1.2.3");          // 0 — multiple numbers
SemVer.ExtractBuildNumber("alpha3.4valid");  // 0 — multiple numbers

SemVer.ExtractBuildNumber(null);             // 0
SemVer.ExtractBuildNumber("");               // 0
SemVer.ExtractBuildNumber("   ");            // 0

Rules

Condition Return value
null, empty, or whitespace 0
Exactly one numeric sequence found That number
Zero or more than one numeric sequence 0
Note

A single numeric sequence larger than int.MaxValue makes ExtractBuildNumber throw OverflowException. The BuildNumberFromPreRelease and BuildNumberFromMetadata properties never throw; they return 0 in that case, for example for timestamp metadata such as 1.0.0+20261014123045.


Practical example

A CI pipeline writes a version like 1.0.0-rc.{BUILD_NUMBER}. After reading the version from a config file you can extract the build counter back out:

var version = SemVer.Parse("1.0.0-rc.42");

int buildNumber = version.BuildNumberFromPreRelease; // 42
Console.WriteLine($"This is release candidate build #{buildNumber}");

Or when the build number lives in metadata:

var version = SemVer.Parse("2.3.0+build.1337");

int buildNumber = version.BuildNumberFromMetadata; // 1337

See also