web-dev-qa-db-fra.com

Comment tester des UUID / GUID valides?

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

Je ne suis actuellement intéressé que par la validation des types 1 et 4, mais cela ne limite pas votre réponse.

218
Marek Sebera

Actuellement, les UUID sont tels que spécifiés dans 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

... garantit que vous avez un UUID formaté de façon canonique, versions 1 à 5, et le variant approprié, conformément à la norme RFC4122.

REMARQUE: les accolades { et } ne sont pas canoniques. Ils sont un artefact de certains systèmes et usages.

Facile à modifier la regex ci-dessus pour répondre aux exigences de la question d'origine.

ASTUCE: groupe de regex/captures

353
Gambol

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 entre 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}‌​\}?$/
55
ryanb

Si vous utilisez Node.js pour le développement, il est recommandé d'utiliser un package appelé Validator. Il inclut toutes les expressions rationnelles requises pour valider les différentes versions d'UUID, en plus de diverses fonctions de validation.

Voici le lien npm: Validator

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

Si vous souhaitez vérifier ou valider une version UUID spécifique, voici les expressions rationnelles correspondantes.

Notez que la seule différence est le numéro de version , expliqué dans le chapitre 4.1.3. Version de ID 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
    
26
Ivan Gabriele

À côté de réponse de Gambol qui fera le travail dans presque tous les cas , toutes les réponses données jusqu'à présent manquaient le formatage groupé (8). -4-4-4-12) n'est pas obligatoire pour encoder les GUID dans le texte . Il est utilisé très souvent, mais il est évident qu'une chaîne simple de 32 chiffres hexadécimaux peut également être valide.[1]  regexenh:

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

[1] La question concerne vérifier ing variable s, nous devrions donc inclure la forme hostile à l'utilisateur aussi bien.

12
Wolf

Toutes les expressions rationnelles spécifiques au type publiées jusqu'à présent échouent sur l'UUID Nil "de type 0", défini au 4.1.7 de la RFC comme étant:

L'UUID nil est une forme spéciale d'UUID spécifiée pour que tous les 128 bits soient mis à zéro: 00000000-0000-0000-0000-000000000000

Pour modifier la réponse de Wolf:

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

Ou bien, pour exclure correctement un "type 0" sans tous les zéros, nous avons les éléments suivants (grâce à Luke):

/^(?:[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a‌​-f]{3}-?[0-9a-f]{12}‌​|00000000-0000-0000-‌​0000-000000000000)$/‌​i
10
Evan Edwards

La petite méthode pour vérifier si String est UUID.

public boolean isUUID(String s){
    return s.matches("^[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}$");
}
2
userTatha

grâce à @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;
}

1
Souhaieb

Je pense qu'un meilleur moyen consiste à utiliser la méthode statique fromString pour éviter ces expressions régulières.

    id = UUID.randomUUID();
    UUID uuid = UUID.fromString(id.toString());
    Assert.assertEquals(id.toString(), uuid.toString());

D'autre part

   UUID uuidFalse = UUID.fromString("x");

émet une exception Java.lang.IllegalArgumentException: chaîne UUID non valide: x

0
Werner Diwischek