Regex for Semantic Version
Semantic version matching is useful in release tooling, changelog parsing, and dependency dashboards where you need to distinguish versions from free text.
The expression
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/How to read it
Anchor: the match must start at the beginning of the string.
Anchor: the match must run to the end of the string.
\d matches a single digit, 0 through 9.
(?: … ) groups without capturing, so it costs nothing to read back.
Nested quantifiers — the shape behind catastrophic backtracking.
Validate your own text, line by line
no inputThis expression is anchored, so it asks whether a whole string is valid. Each line above is tested on its own — it will not find a match inside a longer sentence.
Examples, checked in your browser
4/4 verified1.2.3
Matches.
2.0.0-beta.1+build7
Matches.
01.2.3
No match — this is the kind of input the pattern rejects.
v1.2
No match — this is the kind of input the pattern rejects.
Use it in code
3 languagesconst regex = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/g;
regex.test(input);import re
pattern = re.compile(r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$")
bool(pattern.search(input))re := regexp.MustCompile("^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$")
matched := re.MatchString(input)Other validation patterns
6Valid Email Address
/^[^\s@]+@[^\s@]+\.[^\s@]+$/i
URL Slug
/^[a-z0-9]+(?:-[a-z0-9]+)*$/
Strong Password
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z\d]).{12,}$/
UUID v4
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
IPv4 Address
/^(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|1?\d?\d)){3}$/
Hex Color
/^#?(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/