Regex para versión semántica (semver)

Usa /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/ para comprobar que una cadena completa es una versión semántica (semver) válida. Cada ejemplo de abajo está probado con el patrón, y puedes abrirlo en el Probador de Regex con las muestras ya cargadas.

Actualizado el

/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/
Abrir en el Probador de Regex
EntradaResultadoGrupos
1.0.0✓ Coincide1 0 0
2.10.3-beta.1✓ Coincide2 10 3 beta.1
1.0.0+build.5✓ Coincide1 0 0 build.5
0.1.0-rc.1+sha.5114f85✓ Coincide0 1 0 rc.1 sha.5114f85
1.0✗ No coincide
01.0.0✗ No coincide
v1.0.0✗ No coincide
1.0.0-✗ No coincide

Cómo funciona el patrón

ParteSignificado
(0|[1-9]\d*)Mayor, menor y parche (grupos 1–3): números sin ceros a la izquierda
\.Puntos entre ellos
(?:-([0-9A-Za-z.-]+))?Pre-lanzamiento opcional tras un guion (grupo 4): beta.1, rc.2
(?:\+([0-9A-Za-z.-]+))?Metadatos de compilación opcionales tras un signo más (grupo 5)

Ejemplos 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;

Notas y limitaciones

Una versión práctica de las reglas de semver 2.0; quita primero la v inicial si tus etiquetas la usan. Compara las versiones numéricamente, grupo por grupo, no como cadenas de texto.

Preguntas frecuentes

¿Cuál es la regex para versión semántica (semver)?
/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/ — coincide con la cadena completa. Consulta la tabla de arriba para ver qué hace cada parte.
¿Qué ejemplos coinciden?
De los ejemplos probados, coinciden estos: 1.0.0, 2.10.3-beta.1, 1.0.0+build.5, 0.1.0-rc.1+sha.5114f85. Los demás no.
¿Cómo pruebo esta regex?
Haz clic en “Abrir en el Probador de Regex”: el patrón, los flags y el texto de muestra se cargan automáticamente, y las coincidencias se resaltan mientras editas.