Regex UUID
Most UUID regexes found online predate RFC 9562 (2024): they reject valid v6/v7 UUIDs, or accept impossible version/variant nibbles. Here's an up-to-date pattern, compared against the most copied versions.
/^(?:[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)$/ipasses 20/20 cases
Comparison of existing patterns
| Source | pattern | Score on the 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 | safe |
| 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 | safe |
| 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 | safe |
Implementation
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);Limits
- 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).