Regex para versão semântica (semver)

Use /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/ para verificar se uma string inteira é uma versão semântica (semver) válida. Cada exemplo abaixo foi testado contra o padrão, e você pode abri-lo no Testador de Regex com as amostras já carregadas.

Atualizado em

/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/
Abrir no Testador de Regex
EntradaResultadoGrupos
1.0.0✓ Corresponde1 0 0
2.10.3-beta.1✓ Corresponde2 10 3 beta.1
1.0.0+build.5✓ Corresponde1 0 0 build.5
0.1.0-rc.1+sha.5114f85✓ Corresponde0 1 0 rc.1 sha.5114f85
1.0✗ Não corresponde
01.0.0✗ Não corresponde
v1.0.0✗ Não corresponde
1.0.0-✗ Não corresponde

Como o padrão funciona

ParteSignificado
(0|[1-9]\d*)Maior, menor e patch (grupos 1–3): números sem zeros à esquerda
\.Pontos entre eles
(?:-([0-9A-Za-z.-]+))?Pré-lançamento opcional após um hífen (grupo 4): beta.1, rc.2
(?:\+([0-9A-Za-z.-]+))?Metadados de build opcionais após um sinal de mais (grupo 5)

Exemplos de código

JavaScript

const re = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/;
re.test(value); // true or false

Python

import re

bool(re.fullmatch(r'(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?', value))

PHP

preg_match('/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/', $value) === 1;

Observações e limitações

Uma versão prática das regras do semver 2.0; remova um v inicial antes, se suas tags usarem um. Compare as versões numericamente, grupo a grupo, e não como strings.

Perguntas frequentes

Qual é a regex para versão semântica (semver)?
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/ — ela corresponde à string inteira. Veja a tabela acima para entender o que cada parte faz.
Quais exemplos correspondem?
Dos exemplos testados, correspondem estes: 1.0.0, 2.10.3-beta.1, 1.0.0+build.5, 0.1.0-rc.1+sha.5114f85. Os outros não correspondem.
Como testo essa regex?
Clique em “Abrir no Testador de Regex” — o padrão, as flags e o texto de exemplo carregam automaticamente, e as correspondências são destacadas conforme você edita.