# Regex for Semantic Versions (SemVer)

> The official semver.org regex for versions like 1.2.3, 2.0.0-rc.1 and 1.0.0+build.5, explained token by token, with a looser variant for v-prefixed tags.

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

SemVer versions are MAJOR.MINOR.PATCH, with an optional pre-release (-rc.1) and build metadata (+build.5). This is the pattern published on semver.org: it rejects leading zeros in numeric parts (01.2.3) and captures each component in its own group.

## Token by token

| Token | Meaning |
|---|---|
| `^(0\|[1-9]\d*)` | major version: 0, or a number without leading zeros (group 1) |
| `\.(0\|[1-9]\d*)` | a dot, then the minor version (group 2) |
| `\.(0\|[1-9]\d*)` | a dot, then the patch version (group 3) |
| `(?:-((?:0\|[1-9]\d*\|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0\|[1-9]\d*\|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?` | optional pre-release after a hyphen: dot-separated identifiers, numeric ones without leading zeros (group 4) |
| `(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?` | optional build metadata after a plus sign (group 5) |
| `$` | end of string |

## Examples

- ✓ matches: `1.2.3`
- ✓ matches: `0.1.0`
- ✓ matches: `2.0.0-rc.1`
- ✓ matches: `1.0.0-alpha+001`
- ✓ matches: `10.20.30`
- ✗ does not match: `1.2`
- ✗ does not match: `01.2.3`
- ✗ does not match: `v1.2.3`
- ✗ does not match: `1.2.3-`

## Variations

- `^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$` — release versions only, with an optional v prefix as in Git tags
- `^(\d+)\.(\d+)(?:\.(\d+))?$` — loose: 1.2 or 1.2.3, leading zeros allowed

## Language notes

- semver.org also publishes a named-group version. JavaScript and .NET write named groups as (?<major>…); Python and Go use (?P<major>…).

## FAQ

### Why reject 01.2.3?

The SemVer spec forbids leading zeros in numeric identifiers, so 01.2.3 isn't a valid version. The pattern enforces it with 0|[1-9]\d*.

### How do I compare two versions?

Not with a regex or a string comparison — as text, '1.10.0' sorts before '1.9.0'. Convert the groups to integers, or use a library such as semver on npm.

## Related patterns

- [Regex for Numbers Only (Digits)](https://www.devkult.com/regex/digits-only.md)
- [Regex for Dates in YYYY-MM-DD Format](https://www.devkult.com/regex/date-yyyy-mm-dd.md)
- [Regex for URL Slug Validation](https://www.devkult.com/regex/slug.md)

Open the interactive page: https://www.devkult.com/regex/semver