अगर वेरिएबल में मान्य UUID / GUID पहचानकर्ता है तो कैसे जांचें?
वर्तमान में मैं केवल 1 और 4 प्रकारों को मान्य करने में रुचि रखता हूं, लेकिन यह आपके उत्तरों के लिए सीमा नहीं होनी चाहिए।
अगर वेरिएबल में मान्य UUID / GUID पहचानकर्ता है तो कैसे जांचें?
वर्तमान में मैं केवल 1 और 4 प्रकारों को मान्य करने में रुचि रखता हूं, लेकिन यह आपके उत्तरों के लिए सीमा नहीं होनी चाहिए।
जवाबों:
वर्तमान में, 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
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
बचाव के लिए 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}\}?$/
/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
यदि आप किसी विशिष्ट 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
यदि आप विकास के लिए 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
गमबोल के उत्तर के अलावा , जो लगभग सभी मामलों में काम करेगा , अब तक दिए गए सभी उत्तर चूक गए हैं कि समूहबद्ध स्वरूपण (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}}?
अब तक पोस्ट किए गए सभी प्रकार-विशिष्ट रीगेक्स "टाइप 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
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
मुझे लगता है कि गंबोल का जवाब लगभग सही है, लेकिन यह आरएफसी 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)
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}$");
}
उपर्युक्त उत्तरों का थोड़ा संशोधित संस्करण अधिक संक्षिप्त तरीके से लिखा गया है। यह किसी भी 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 बार दोहराता है
A-f
ऐसा होना चाहिए A-F
:/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
नोड में इसे करने का एक अच्छा तरीका 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
मुझे लगता है कि एक बेहतर तरीका उन नियमित अभिव्यक्तियों से बचने के लिए स्थैतिक विधि का उपयोग कर रहा है।
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