Come testare UUID / GUID validi?

Come verificare se la variabile contiene un identificatore UUID / GUID valido?

Al momento sono interessato solo a convalidare i tipi 1 e 4, ma non è un limite per la tua risposta.

Attualmente, gli UUID sono specificati in RFC4122.

Pertanto per convalidare 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 

… garantisce un UUID formattato canonicamente dalla Versione 1 alla 5 ed è la Variante appropriata come da RFC4122.

NOTA: le parentesi graffe { e } non sono canoniche. Sono un artefatto di alcuni sistemi e usi.

Facile da modificare la regex precedente per soddisfare i requisiti della domanda originale.

SUGGERIMENTO: regex group / capture

regex al salvataggio

 /^[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'); 

o con parentesi

 /^\{?[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}‌​\}?$/ 

Se si sta utilizzando Node.js per lo sviluppo, si consiglia di utilizzare un pacchetto chiamato Validator. Include tutte le regex necessarie per convalidare diverse versioni di UUID, oltre a varie altre funzioni per la convalida.

Ecco il link npm: Validator

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

Se si desidera verificare o convalidare una specifica versione UUID, ecco le regex corrispondenti.

Si noti che l’unica differenza è il numero di versione , che è spiegato in 4.1.3. Version 4.1.3. Version capitolo di UUID 4122 RFC .

Il numero di versione è il primo carattere del terzo gruppo: [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 

Oltre alla risposta di Gambol che farà il lavoro in quasi tutti i casi , tutte le risposte date finora non hanno compreso che la formattazione raggruppata (8-4-4-4-12) non è obbligatoria per codificare i GUID nel testo . È usato molto spesso ma ovviamente anche una semplice catena di 32 cifre esadecimali può essere valida. [1] regex enh :

 /^[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 domanda riguarda la verifica della variabile s, quindi dovremmo includere anche la forma non ostile dell’utente.

  • Perché ci sono trattini in un GUID .NET? – Stack Overflow più risposta accettata
  • Testare e convalidare un GUID (guid.us)
  • Metodo Guid.ToString (String) (MSDN)

Tutte le regex specifiche del tipo postate finora falliscono nell’UUID Nil “tipo 0”, definito in 4.1.7 della RFC come:

L’UUID nil è una forma speciale di UUID specificata per avere tutti i 128 bit impostati a zero: 00000000-0000-0000-0000-000000000000

Per modificare la risposta di 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 

Oppure, per escludere correttamente un “tipo 0” senza tutti gli zeri, abbiamo il seguente (grazie a Luca):

 /^(?:[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 

Il piccolo metodo per verificare se String è 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}$"); }