Rexact
Cheatsheet

Regex UUID

La plupart des regex UUID trouvées en ligne datent d'avant RFC 9562 (2024) : elles rejettent les UUID v6/v7 pourtant valides, ou acceptent des nibbles de version/variant impossibles. Voici un motif à jour, comparé aux versions les plus copiées.

/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i
passe 20/20 cas

Comparatif des patterns existants

SourcepatternScore sur le corpusReDoS
Stack Overflow — réponse la plus votée, 762 votes (Ivelin) — ni casse ni version/variant vérifiés^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$15 / 20sûr
Stack Overflow — réponse conforme RFC 4122, 613 votes (Gambol) — limitée aux versions 1 à 5^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$14 / 20sûr
validator.js — variante « loose » (insensible à la casse, sans vérification de version/variant)^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$17 / 20sûr

Implémentation

const re = new RegExp("^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", "i");
re.test(input);

Limites

  • Valide seulement la forme : un UUID syntaxiquement correct peut ne correspondre à aucune ressource réelle.
  • N'accepte que le format canonique avec tirets (8-4-4-4-12) : rejette le format sans tirets ou entre accolades ({…}), parfois produits par d'anciennes bibliothèques .NET/COM (GUID).
  • Version 9 et au-delà (réservées par RFC 9562 pour un usage futur) ne sont volontairement pas acceptées : un nouveau format de version devra mettre ce motif à jour.
  • Ne vérifie pas que la version déclarée correspond réellement à la méthode de génération (un attaquant peut forger un UUID v4 syntaxiquement valide sans aléa réel).