কীভাবে বৈধ ইউআইডি / জিইউডি পরীক্ষা করবেন?


270

চলকটিতে বৈধ ইউআইডি / জিইউডি সনাক্তকারী রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?

আমি বর্তমানে কেবলমাত্র 1 এবং 4 প্রকারের বৈধতা দেওয়ার বিষয়ে আগ্রহী, তবে এটি আপনার উত্তরগুলির সীমাবদ্ধতা হওয়া উচিত নয়।


স্ট্রিং ফর্ম্যাটে, হেক্স নয়, বিন নয়, অথবা আপনি কী চাইবেন তা আমি জানি না
মারেক সেবেরা

^ (\ {) {0,1} [0-9a-ফা-এফ] {8} \ - [0-9a-ফা-এফ] {4} \ - [0-9a-ফা-এফ] {4} \ - [0-9a-fA-F] {4} \ - [0-9a-fA-F] {12} (\}) {0,1} $
ব্র্যান্ডন মোরেটজ

আপনি যদি টানা 32 টি হেক্স অঙ্কের শৃঙ্খলা (গ্রুপিং ছাড়াই) যুক্ত ভেরিয়েবলগুলি বাদ দিতে না পারেন তবে আমার উত্তরটি দেখুন
ওল্ফ

উত্তর:


413

বর্তমানে, ইউএইউডিএসগুলি আরএফসি 4122-এ উল্লিখিত হিসাবে রয়েছে। একটি প্রায়ই উপেক্ষিত প্রান্ত ক্ষেত্রে NIL UUID উল্লেখ নেই এখানে । নিম্নোক্ত রেজেক্স এটিকে বিবেচনায় নিয়েছে এবং কোনও নীল ইউইউইডির জন্য একটি ম্যাচ ফেরত দেবে। কোনও ইউইউডি-র জন্য নীচে দেখুন যা কেবল নন-এনআইএল ইউআইডিগুলি গ্রহণ করে। এই উভয় সমাধানের জন্য 1 থেকে 5 সংস্করণ (তৃতীয় ব্লকের প্রথম অক্ষর দেখুন)।

সুতরাং একটি ইউআইডি বৈধ করার জন্য ...

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

... নিশ্চিত করে যে আপনার কাছে একটি প্রমিত বিন্যাসিত ইউইউডি রয়েছে যা সংস্করণ 1 থেকে 5 অবধি এবং আরএফসি 4122 অনুসারে উপযুক্ত বৈকল্পিক।

দ্রষ্টব্য: ধনুর্বন্ধনী {এবং প্রচলিত }নয়। এগুলি কিছু সিস্টেম এবং ব্যবহারের একটি নিদর্শন।

মূল প্রশ্নের প্রয়োজনীয়তা মেটাতে উপরের রেজেক্সটিকে সংশোধন করা সহজ।

ইঙ্গিত: রেজেক্স গ্রুপ / ক্যাপচারগুলি

নীল ইউইউডিটির সাথে ম্যাচটি এড়াতে:

/^[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] {3। ভুল। আমার কাছে একটি বৈধ ইউআইডি আছে যাতে "বি06 এ" রয়েছে এবং এটি আমার পক্ষে ব্যর্থ হয়েছিল।
ফিলিপ ব্রহ্ম

1
@ ফিলিপব্রাহ্ম, [1-5] আরএফসি অনুসারে ঠিক, 4 টি বিট সংস্করণ নির্দেশ করে এবং এখানে কেবল 5 টি সংস্করণ রয়েছে।
rvignacio

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

58

রেগেক্স উদ্ধার

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

আপনি যদি কোনও নির্দিষ্ট ইউআইডি সংস্করণ পরীক্ষা করতে বা যাচাই করতে চান তবে এখানে সম্পর্কিত রেজিেক্সগুলি দেওয়া হচ্ছে।

মনে রাখবেন যে পার্থক্যটি হ'ল সংস্করণ নম্বর , যা ইউআইডি 4122 আরএফসির4.1.3. Version অধ্যায়ে ব্যাখ্যা করা হয়েছে ।

সংস্করণ নম্বরটি তৃতীয় গোষ্ঠীর প্রথম চরিত্র [VERSION_NUMBER][0-9A-F]{3}:

  • ইউআইডি ভি 1:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • ইউআইডি ভি 2:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[2][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • ইউআইডি ভি 3:

    /^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[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

39

আপনি যদি উন্নয়নের জন্য নোড.জেএস ব্যবহার করেন তবে এটি ভ্যালিডেটর নামে একটি প্যাকেজ ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। এটিতে ইউআইডি'র বিভিন্ন সংস্করণ যাচাই করার জন্য প্রয়োজনীয় সমস্ত রেইগেক্সগুলি অন্তর্ভুক্ত রয়েছে যাচাইয়ের জন্য আপনি অন্যান্য বিভিন্ন ফাংশন পান।

এখানে এনপিএম লিঙ্ক: ভ্যালিডেটর

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
ভ্যালিডেটার কেবল ইউইউডি ভি 3-5 সমর্থন করে না ভি 1
পিটব

13

গাম্বলের উত্তর ছাড়াও প্রায় সব ক্ষেত্রেই এটি কাজ করবে , এখন পর্যন্ত প্রদত্ত সমস্ত উত্তর মিস করেছে যে গোষ্ঠীযুক্ত ফর্ম্যাটিং (8-4-4-4-12) পাঠ্যে জিইউইডিগুলি এনকোড করা বাধ্যতামূলক নয় । এটি অত্যন্ত প্রায়শই ব্যবহৃত হয় তবে স্পষ্টতই 32 টি হেক্সাডেসিমাল ডিজিটের একটি সরল চেইনটি বৈধ হতে পারে। [1] রেজেক্স এনহ :

/^[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] প্রশ্নটি ভেরিয়েবলগুলি পরীক্ষা করার বিষয়ে , সুতরাং আমাদের ব্যবহারকারী-বন্ধুত্বপূর্ণ ফর্মটিও অন্তর্ভুক্ত করা উচিত।


এই আমার fave হয়। আরও ভাল{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
মাইক নেলসন

10

আরএফসির ৪.১..7 এ সংজ্ঞায়িত "টাইপ 0" নীল ইউইউডি-তে এ পর্যন্ত পোস্ট করা সমস্ত প্রকার-নির্দিষ্ট রেজেক্সগুলি ব্যর্থ হচ্ছে:

নীল ইউইউডিউ ইউইউডি-র বিশেষ রূপ যা সমস্ত 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

নীল ইউআইইউডের প্রথম ইউআইডি বিভাগে 8 টি শূন্য থাকা উচিত, নয় 7. সরবরাহিত রেজেক্স এটি 7 দিয়ে বৈধতা দেয় নি
রিচ সেভিওরা

2
আপনার দেখতে সুন্দর লাগছে তবে কিছু অবৈধ ইউআইডিগুলিকে অনুমতি দেয় যেমন: abcdef00-0000-0000-0000-000000000000 আপনার রেজেক্সের সাথে মেলে। এই রেজেক্সটি শূন্য সহ বৈধ ইউআইডিগুলির সাথে মিলবে:/^(?:[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

কিছু সংশোধন সহ @ ইউসারতকে ধন্যবাদ

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..b) কভার করে তবে ভেরিয়েন্ট -0 (0xxx = 0..7) এবং ভেরিয়েন্ট -2 (110x = সি..ডি) রূপগুলি অন্তর্ভুক্ত করে না যা পশ্চাদগম্য সামঞ্জস্যের জন্য সংরক্ষিত, সুতরাং তারা প্রযুক্তিগতভাবে বৈধ ইউআইডি হয়। ভেরিয়েন্ট -4 (111x = ই..ফ) প্রকৃতপক্ষে ভবিষ্যতের ব্যবহারের জন্য সংরক্ষিত, সুতরাং সেগুলি বর্তমানে বৈধ নয়।

এছাড়াও, 0 প্রকারটি বৈধ নয়, সেই "ডিজিট" কেবল 0 হতে অনুমোদিত যদি এটি একটি নীল ইউআইডিউড হয় (যেমন ইভানের উত্তরে উল্লিখিত )।

সুতরাং আমি মনে করি বর্তমান আরএফসি 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

স্ট্রিংটি ইউআইডি কিনা তা পরীক্ষা করতে। ম্যাচ () পদ্ধতিটি ব্যবহার করুন।

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

আনকড টাইপ এরির: এস.মেচগুলি কোনও ফাংশন নয়
দীপ কাক্কার

1
প্রদত্ত লিপিটি জাভাস্ক্রিপ্ট নয়, যা ওপি চেয়েছিল।
স্টিফানজানসেন

উপরের মন্তব্যগুলিকে সম্বোধন করার জন্য সামঞ্জস্যিত উত্তর। সমাধান এখন প্রত্যাশার মতো কাজ করে।
ডিজোন

এটি এখনও জেএস নয়।
ktilcu

1

উপরের উত্তরগুলির একটি সামান্য পরিবর্তিত সংস্করণ আরও সংক্ষিপ্ত উপায়ে লেখা। এটি হাইফেন সহ যে কোনও জিইউডি বৈধ করবে (তবে হাইফেনগুলি alচ্ছিক করতে সহজেই সংশোধন করা হয়েছে)। এটি আপার এবং লোয়ার কেস চরিত্রগুলিকে সমর্থন করবে যা নির্দিষ্টকরণ নির্বিশেষে সম্মেলনে পরিণত হয়েছে:

/^([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
ডিজোন

যদি আপনি মামলাটি (/ 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

আমি মনে করি regular নিয়মিত অভিব্যক্তিগুলি এড়াতে আরও ভাল উপায় স্ট্রিং থেকে স্থিতিশীল পদ্ধতিটি ব্যবহার করা।

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

অন্য দিকে

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

java.lang.IllegalArgumentException নিক্ষেপ করে: অবৈধ ইউইউডি স্ট্রিং: এক্স

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.