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.
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.
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.
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)
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
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)));
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.