357 votes

Comment tester un UUID/GUID valide ?

Comment vérifier si une variable contient un identifiant UUID/GUID valide ?

Je ne suis actuellement intéressé que par la validation des types 1 et 4, mais ce n'est pas une limite pour votre réponse.

0 votes

Au format chaîne, pas hex, pas bin, ou je ne sais pas ce que vous demandez

0 votes

^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0‌​-9a-fA-F]{4}\-[0-9a-‌​fA-F]{12}(\}){0,1}$

0 votes

Si vous ne parvenez pas à exclure les variables contenant une chaîne de 32 chiffres hexadécimaux consécutifs (sans regroupement), consultez le site suivant ma réponse

531voto

Gambol Points 576

Actuellement, les UUID sont spécifiés dans la RFC4122.

Donc pour valider un UUID...

/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i

...s'assure que vous disposez d'un UUID formaté de manière canonique, de la version 1 à 5 et de la variante appropriée conformément à la RFC4122.

NOTE : Les accolades "{" et "}" ne sont pas canoniques. Elles sont un artefact de certains systèmes et usages.

Il est facile de modifier la regex ci-dessus pour répondre aux exigences de la question originale.

ASTUCE : groupe regex/captures

1 votes

Je pense que [1-5][0-9a-f]{3} est incorrect. J'ai un UUID valide qui a "b06a" dans cette partie, et cela a échoué pour moi.

1 votes

@FelipeBrahm, [1-5] est correct selon la RFC, que 4 bits indiquent la version, et il y a seulement 5 versions.

1 votes

749d0000-0194-1005-2e05-08d61613bf2f ne fonctionne pas pour moi dans le violon.

75voto

Ivan Gabriele Points 3226

Si vous voulez vérifier ou valider une version spécifique de l'UUID, voici les regex correspondants.

Notez que la seule différence est le numéro de version qui est expliqué dans 4.1.3. Version chapitre de UUID 4122 RFC .

Le numéro de version est le premier caractère du troisième groupe : [VERSION_NUMBER][0-9A-F]{3} :

  • UUID v1 :

    /^[0-9A-F]{8}-[0-9A-F]{4}-[1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • UUID v2 :

    /^[0-9A-F]{8}-[0-9A-F]{4}-[2][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • UUID v3 :

    /^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • UUID v4 :

    /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • UUID v5 :

    /^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i

75voto

ryanb Points 304

regex à la rescousse

/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test('01234567-9ABC-DEF0-1234-56789ABCDEF0');

ou avec des crochets

/^\{?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}‌​\}?$/

3 votes

Ou si vous avez des parenthèses : /^\{?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F‌​]{4}-[0-9a-fA-F]{12}‌​\}?$/.test('01234567‌​-9ABC-DEF0-1234-5678‌​9ABCDEF0');

0 votes

Ce n'est pas tout à fait correct. Il manque que [1-5] (version) commence le 3ème bloc et que [89AB] (variante) commence le 4ème bloc. La réponse de Gambol fait bien les choses.

9 votes

Version plus concise (sans les parenthèses) : /^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i

47voto

user2731189 Points 13

Si vous utilisez Node.js pour le développement, il est recommandé d'utiliser un paquet appelé Validator. Il comprend toutes les expressions rationnelles nécessaires pour valider les différentes versions d'UUID, ainsi que diverses autres fonctions de validation.

Voici le lien npm : Validateur

var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false

1 votes

Intéressant, mais on dirait qu'il s'attend à des traits d'union ? Voici les quatre regex qu'il utilise actuellement -- /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{‌​12}$/i et/ou /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-‌​9A-F]{12}$/i et/ou /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-‌​9A-F]{12}$/i et/ou /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{1‌​2}$/i

1 votes

Le validateur ne prend en charge que les UUID v3-5 et non v1.

23voto

Souhaieb Points 389

Merci à @usertatha avec quelques modifications

function isUUID ( uuid ) {
    let s = "" + uuid;

    s = s.match('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$');
    if (s === null) {
      return false;
    }
    return true;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X