🔍Regex Recipes

Semantic Version (x.y.z)

Validate semantic versioning with optional prerelease and build metadata.

Pattern

^(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-]+)*))?$

Explanation

Full semver validation including major.minor.patch, prerelease (after -), and build metadata (after +).

Examples

Basic
Input
1.0.0
Output
✓ Match
With prerelease
Input
1.0.0-alpha
Output
✓ Match
Full format
Input
1.0.0-beta.1+build.123
Output
✓ Match
Invalid - leading zero
Input
01.0.0
Output
✗ No match

Code Examples

JavaScript
// Simple version (major.minor.patch only)
const simpleVersion = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/;

// Parse version
function parseVersion(version) {
  const match = version.match(simpleVersion);
  if (!match) return null;
  return {
    major: parseInt(match[1]),
    minor: parseInt(match[2]),
    patch: parseInt(match[3])
  };
}

// Compare versions
function compareVersions(a, b) {
  const vA = parseVersion(a);
  const vB = parseVersion(b);
  if (!vA || !vB) return 0;
  
  if (vA.major !== vB.major) return vA.major - vB.major;
  if (vA.minor !== vB.minor) return vA.minor - vB.minor;
  return vA.patch - vB.patch;
}

Try it Now

💡 Tips

  • Major.minor.patch must be non-negative integers
  • Prerelease: -alpha, -beta.1, -rc.2
  • Build metadata: +build.123, +sha.5114f85
  • Use semver library (npm) for full support

⚠️ Common Pitfalls

  • Leading zeros not allowed (01.0.0 is invalid)
  • Prerelease versions compare differently
  • Use semver library for production
  • Build metadata ignored in version precedence