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)$/ipasse 20/20 cas
Comparatif des patterns existants
| Source | pattern | Score sur le corpus | ReDoS |
|---|---|---|---|
| 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 / 20 | sû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 / 20 | sû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 / 20 | sû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).