424 Stimmen

Wie prüfe ich eine gültige UUID/GUID?

Wie kann man prüfen, ob eine Variable einen gültigen UUID/GUID-Bezeichner enthält?

Ich bin derzeit nur an der Validierung der Typen 1 und 4 interessiert, aber das sollte keine Einschränkung für Ihre Antworten sein.

5voto

James Morrison Punkte 1790

Eine leicht abgewandelte Version der obigen Antworten in einer prägnanteren Form. Damit wird jede GUID mit Bindestrichen validiert (die Bindestriche können jedoch leicht so geändert werden, dass sie optional sind). Außerdem werden Groß- und Kleinbuchstaben unterstützt, was sich unabhängig von der Spezifikation als Konvention durchgesetzt hat:

/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i

Der Schlüssel dazu ist der folgende, sich wiederholende Teil

(([0-9a-fA-F]{4}\-){3})

Dabei werden die 4 Zeichenmuster einfach 3 Mal wiederholt.

4voto

B. Zoli Punkte 41

Ich denke Gambols Antwort ist fast perfekt, aber es interpretiert die RFC 4122 § 4.1.1. Variante Abschnitt ein wenig.

Sie deckt die UUIDs der Variante-1 (10xx = 8..b) ab, nicht aber die der Variante-0 (0xxx = 0..7) und der Variante-2 (110x = c..d), die für die Abwärtskompatibilität reserviert sind, so dass sie technisch gültige UUIDs sind. Variante-4 (111x = e..f) ist in der Tat für die künftige Verwendung reserviert, so dass sie derzeit nicht gültig sind.

Außerdem ist der Typ 0 nicht gültig, die "Ziffer" darf nur 0 sein, wenn es sich um eine NIL UUID handelt (wie in Evans Antwort ).

Ich denke, die genaueste Regex, die der aktuellen RFC 4122-Spezifikation entspricht, ist (einschließlich Bindestriche):

/^([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-d][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
                            ^                ^^^^^^
                    (0 type is not valid)  (only e..f variant digit is invalid currently)

2voto

blackcatweb Punkte 931

Eine gute Möglichkeit, dies in Node zu tun, ist die Verwendung der ajv Paket ( https://github.com/epoberezkin/ajv ).

const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefaults: true, verbose: true });
const uuidSchema = { type: 'string', format: 'uuid' };
ajv.validate(uuidSchema, 'bogus'); // returns false
ajv.validate(uuidSchema, 'd42a8273-a4fe-4eb2-b4ee-c1fc57eb9865'); // returns true with v4 GUID
ajv.validate(uuidSchema, '892717ce-3bd8-11ea-b77f-2e728ce88125'); // returns true with a v1 GUID

2voto

Benjamin Punkte 25

Versionen 1 bis 5, ohne Verwendung einer Multiversions-Regex, wenn Version weggelassen wird.

const uuid_patterns = {
  1: /^[0-9A-F]{8}-[0-9A-F]{4}-1[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  2: /^[0-9A-F]{8}-[0-9A-F]{4}-2[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
  4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
  5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
};

const isUUID = (input, version) => {    
    if(typeof input === "string"){
        if(Object.keys(uuid_patterns).includes(typeof version === "string" ? version : String(version))){
            return uuid_patterns[version].test(input);
        } else {
            return Object.values(uuid_patterns).some(pattern => pattern.test(input));
        }
    }
    return false;
}

// Testing
let valid = [
    'A987FBC9-4BED-3078-CF07-9141BA07C9F3',
    'A987FBC9-4BED-4078-8F07-9141BA07C9F3',
    'A987FBC9-4BED-5078-AF07-9141BA07C9F3',
];

let invalid = [
    '',
    'xxxA987FBC9-4BED-3078-CF07-9141BA07C9F3',
    'A987FBC9-4BED-3078-CF07-9141BA07C9F3xxx',
    'A987FBC94BED3078CF079141BA07C9F3',
    '934859',
    '987FBC9-4BED-3078-CF07A-9141BA07C9F3',
    'AAAAAAAA-1111-1111-AAAG-111111111111',
];

valid.forEach(test => console.log("Valid case, result: "+isUUID(test)));
invalid.forEach(test => console.log("Invalid case, result: "+isUUID(test)));

1voto

userTatha Punkte 103

Verwenden Sie die Methode .match(), um zu prüfen, ob String eine UUID ist.

public boolean isUUID(String s){
    return 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}$");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X