वैध UUID / GUID का परीक्षण कैसे करें?


270

अगर वेरिएबल में मान्य UUID / GUID पहचानकर्ता है तो कैसे जांचें?

वर्तमान में मैं केवल 1 और 4 प्रकारों को मान्य करने में रुचि रखता हूं, लेकिन यह आपके उत्तरों के लिए सीमा नहीं होनी चाहिए।


स्ट्रिंग प्रारूप में, हेक्स नहीं, बिन नहीं, या मुझे नहीं पता कि आप क्या पूछते हैं
मारेक सेबेरा

^ (\ {) {0,1} [0-9a-एफए एफ] {8} \ - [0-9a-एफए एफ] {4} \ - [0-9a-एफए एफ] {4} \ - [0-9a-एफए एफ] {4} \ - [0-9a-एफए एफ] {12} (\}) {0,1} $
ब्रैंडन Moretz

यदि आप 32 लगातार हेक्स अंकों (समूह के बिना) की श्रृंखला वाले वेरिएबल्स को बाहर नहीं कर सकते हैं, तो मेरे जवाब
वुल्फ

जवाबों:


413

वर्तमान में, UUID RFC4122 में निर्दिष्ट हैं। एक अक्सर उपेक्षित किनारा मामला NIL UUID है, जिसे यहां नोट किया गया है । निम्नलिखित regex इसे ध्यान में रखता है और एक NIL UUID के लिए एक मैच लौटाएगा। UUID के लिए नीचे देखें जो केवल गैर-NIL UUID को स्वीकार करता है। ये दोनों समाधान संस्करण 1 से 5 के लिए हैं (तीसरे ब्लॉक का पहला चरित्र देखें)।

इसलिए एक UUID को मान्य करने के लिए ...

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

... सुनिश्चित करता है कि आपके पास एक कैनोनिक रूप से स्वरूपित UUID है जो 5 के माध्यम से संस्करण 1 है और RFC12122 के अनुसार उपयुक्त वेरिएंट है।

नोट: ब्रेसिज़ {और }विहित नहीं हैं। वे कुछ प्रणालियों और उपयोगों की एक कलाकृति हैं।

मूल प्रश्न की आवश्यकताओं को पूरा करने के लिए उपरोक्त रेगेक्स को संशोधित करना आसान है।

HINT: regex group / captures

NIL 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


1
मुझे लगता है कि [1-5] [0-9a-f] {३} गलत है। मेरे पास एक वैध यूयूआईडी है जिसमें उस भाग में "b06a" है, और यह मेरे लिए विफल हो रहा था।
फेलिप ब्रह्म

1
@FelipeBrahm, [1-5] RFC के अनुसार सही है, कि 4 बिट्स संस्करण को दर्शाते हैं, और केवल 5 संस्करण हैं।
रिविनासियो

749d0000-0194-1005-2e05-08d61613bf2f फिडेल में मेरे लिए विफल रहता है
लूटता है

1
जिज्ञासा से बाहर, (क्यों) निम्नलिखित भी मान्य नहीं होगा: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
tjeerdnet

58

बचाव के लिए regex

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

या कोष्ठक के साथ

/^\{?[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
या यदि आपके पास कोष्ठक हो सकते हैं: / ^ \ {? [0-9a-fA-F] {8} - [0-9a-fA-F] {4} - [0-9a-fA-F] {4} - [0-9a-एफए एफ] {4} - [0-9a-एफए एफ] {12} \} $ / परीक्षण ( '01234567-9ABC-DEF0-1234-56789ABCDEF0')?।
ryanb

यह काफी सही नहीं है। यह याद आता है कि [1-5] (संस्करण) 3 खंड को शुरू करता है और [89AB] (संस्करण) 4 खंड को शुरू करता है। गमबोल का जवाब सही है।
वुल्फ

7
अधिक संक्षिप्त संस्करण (कोष्ठक की अनदेखी):/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
c24w

41

यदि आप किसी विशिष्ट UUID संस्करण को जांचना या मान्य करना चाहते हैं, तो यहां संबंधित रेग्जेस हैं।

ध्यान दें कि एकमात्र अंतर संस्करण संख्या है , जिसे यूयूआईडी 4122 आरएफसी के4.1.3. Version अध्याय में समझाया गया है ।

संस्करण संख्या तीसरे समूह का पहला वर्ण है [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

39

यदि आप विकास के लिए Node.js का उपयोग कर रहे हैं, तो Validator नामक पैकेज का उपयोग करने की अनुशंसा की जाती है। इसमें यूयूआईडी के अलग-अलग संस्करणों को मान्य करने के लिए आवश्यक सभी रीगेक्स शामिल हैं, आपको सत्यापन के लिए विभिन्न अन्य कार्य मिलते हैं।

यहाँ npm लिंक है: Validator

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

दिलचस्प है, लेकिन ऐसा लगता है कि यह हाइफ़न की अपेक्षा करता है? यहां वर्तमान में उपयोग किए जा रहे चार रेगीक्स हैं - /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i और / या /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i / /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i और / और / या /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
रफिन

1
सत्यापनकर्ता केवल UUID v3-5 को v1 का समर्थन नहीं करता है
peteb

13

गमबोल के उत्तर के अलावा , जो लगभग सभी मामलों में काम करेगा , अब तक दिए गए सभी उत्तर चूक गए हैं कि समूहबद्ध स्वरूपण (8-4-4-4-12) को टेक्स्ट में GUID को एनकोड करना अनिवार्य नहीं है । यह बहुत बार उपयोग किया जाता है, लेकिन जाहिर है कि 32 हेक्साडेसिमल अंकों की एक सादे श्रृंखला भी मान्य हो सकती है। [१] रेगेक्स एनएच :

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

[१] प्रश्न चेक आईएनजी वेरिएबल एस के बारे में है , इसलिए हमें उपयोगकर्ता-अनफ्रीडम फॉर्म को भी शामिल करना चाहिए।


यह एक मेरी दासी है। इससे भी बेहतर{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
माइक नेल्सन

10

अब तक पोस्ट किए गए सभी प्रकार-विशिष्ट रीगेक्स "टाइप 0" नील UUID पर विफल हो रहे हैं, जो RFC के 4.1.7 में परिभाषित हैं:

नील यूयूआईडी यूयूआईडी का विशेष रूप है जो सभी 128 बिट्स को शून्य पर सेट करने के लिए निर्दिष्ट है: 00000000-0000-0000-0000-000000000000

वुल्फ के उत्तर को संशोधित करने के लिए:

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

या, सभी शून्य के बिना एक "टाइप 0" को ठीक से बाहर करने के लिए, हमारे पास निम्नलिखित हैं (ल्यूक के लिए धन्यवाद):

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

नील UUID के पहले UUID सेगमेंट में 8 शून्य होने चाहिए, न कि 7. Regex ने इसे 7 के साथ मान्य नहीं किया
रिच सेवियोरा

2
आपका अच्छा लग रहा है, लेकिन कुछ अमान्य UUIDs की अनुमति देता है जैसे: abcdef00-0000-0000-0000-000000000000 आपके regex से मेल खाएगा। यह रेगेक्स वैध यूयूआईडी से मेल खाएगा, जिसमें नील भी शामिल है:/^(?:[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

कुछ संशोधन के साथ @usertatha को धन्यवाद

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;
}

2

मुझे लगता है कि गंबोल का जवाब लगभग सही है, लेकिन यह आरएफसी 4122 § 4.1.1 को गलत बताता है। वेरिएंट सेक्शन थोड़ा।

यह वेरिएंट -1 यूयूआईडी (10xx = 8. बी) को शामिल करता है, लेकिन वेरिएंट -0 (0xxx = 0..7) और वेरिएंट -2 (110x = c..d) वेरिएंट को कवर नहीं करता है, जो पिछड़े संगतता के लिए आरक्षित हैं, इसलिए वे तकनीकी रूप से मान्य यूयूआईडी हैं। वेरिएंट -4 (111x = e..f) वास्तव में भविष्य के उपयोग के लिए आरक्षित है, इसलिए वे वर्तमान में मान्य नहीं हैं।

इसके अलावा, 0 प्रकार मान्य नहीं है, यह "अंक" केवल 0 होने की अनुमति है यदि यह एक NIL UUID है (जैसे कि इवान के उत्तर में उल्लेख किया गया है )।

इसलिए मुझे लगता है कि वर्तमान RFC 4122 विनिर्देशनों का अनुपालन करने वाला सबसे सटीक रेगेक्स है (हाइफ़न सहित):

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

1

String UUID है या नहीं यह जाँचने के लिए .match () विधि का उपयोग करें।

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}$");
}

अनकैप्ड टाइपर: s.matches एक फंक्शन नहीं है
दीप कक्कर

1
दी गई स्क्रिप्ट जावास्क्रिप्ट नहीं है, जो कि ओपी ने मांगी है।
स्टीफनजैनसेन

ऊपर टिप्पणियों को संबोधित करने के लिए समायोजित उत्तर। समाधान अब उम्मीद के मुताबिक काम करता है।
डेजोन

वह अभी भी js नहीं है।
ktilcu 20

1

उपर्युक्त उत्तरों का थोड़ा संशोधित संस्करण अधिक संक्षिप्त तरीके से लिखा गया है। यह किसी भी GUID को हाइफ़न के साथ मान्य करेगा (हालाँकि हाइफ़न को वैकल्पिक बनाने के लिए आसानी से संशोधित किया गया है)। यह ऊपरी और निचले मामलों के पात्रों का भी समर्थन करेगा जो विनिर्देश की परवाह किए बिना सम्मेलन बन गए हैं:

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

यहाँ कुंजी नीचे वाला दोहराव है

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

जो केवल 4 चार पैटर्न को 3 बार दोहराता है


1
A-fऐसा होना चाहिए A-F:/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
DeeZone

यदि आप मामला (/ i), क्यों दोहराना और फिर वायुसेना?
निमरोड

0

नोड में इसे करने का एक अच्छा तरीका ajvपैकेज ( https://github.com/epoberezkin/ajv ) का उपयोग करना है ।

const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefault: 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

-1

मुझे लगता है कि एक बेहतर तरीका उन नियमित अभिव्यक्तियों से बचने के लिए स्थैतिक विधि का उपयोग कर रहा है।

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

दूसरी ओर

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

फेंकता java.lang.IllegalArgumentException: अमान्य UUID स्ट्रिंग: x

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.