রেজেেক্স সহ পাঠ্যে ইউআইডিগুলি অনুসন্ধান করা হচ্ছে


224

আমি একটি রেজেেক্স ব্যবহার করে পাঠ্যের ব্লকগুলিতে ইউআইডিগুলি অনুসন্ধান করছি। বর্তমানে আমি এই ধারনাটির উপর নির্ভর করছি যে সমস্ত ইউইউডিগুলি 8-4-4-4-4-12 হেক্সাডেসিমাল অঙ্কগুলির একটি প্যাটার্ন অনুসরণ করবে।

কেউ কি এমন কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারেন যেখানে এই অনুমানটি অবৈধ হবে এবং আমাকে কিছু ইউইউডি মিস করতে পারে?


এই প্রশ্নটি 6 বছর আগে পাঠ্যের একটি ব্লকে ক্রেডিট কার্ডগুলি সন্ধান করার জন্য একটি প্রকল্পে আমাকে সহায়তা করা ছিল। পরে আমি আমার ব্লগ পোস্ট থেকে লিঙ্কযুক্ত কোডটি স্রোস করেছি
গাই

4
ইউআইডি নিয়মিত প্রকাশের প্যাটার্ন মিলের জন্য অনুসন্ধান আমাকে এই স্ট্যাক ওভারফ্লো পোস্টে নিয়ে এসেছিল তবে স্বীকৃত উত্তর আসলে কোনও উত্তর নয়। অতিরিক্তভাবে, আপনার প্রশ্নের নীচের মন্তব্যে আপনি যে লিঙ্কটি সরবরাহ করেছেন তাতেও প্যাটার্নটি নেই (যদি না আমি কিছু মিস করছি)। এর মধ্যে একটির উত্তর কি এমন কিছু যা আপনি ব্যবহার করে শেষ করেছেন?
তাস

যদি আপনি পোস্ট করেন এমন একটি দিয়ে শুরু হওয়া লিঙ্কগুলির খরগোশের সতর্কতা অনুসরণ করে আপনি গিটহাবের এই লাইনটি পেরিয়ে আসতে পারেন যা অবশেষে আমি ব্যবহার করেছি ge (এটি বোধগম্য যে, এটা কঠিন থেকে।) এটা কোড এবং যে ফাইল আপনি সাহায্য করতে পারেন: github.com/guyellis/CreditCard/blob/master/Company.CreditCard/...
গায়

1
এই উত্তরগুলির মধ্যে কোনওটিই কেবল বৈধ আরএফসি 4122 ইউআইডি-র সমস্ত বৈকল্পিকের জন্য একটি একক রেগেক্স দেবে বলে মনে হচ্ছে না। তবে দেখে মনে হচ্ছে এরকম উত্তর এখানে দেওয়া হয়েছিল: stackoverflow.com/a/13653180/421049
গ্যারেট উইলসন

উত্তর:


41

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

"ca761232ed4211cebacd00aa0057b223" 

"CA761232-ED42-11CE-BACD-00AA0057B223" 

"{CA761232-ED42-11CE-BACD-00AA0057B223}" 

"(CA761232-ED42-11CE-BACD-00AA0057B223)" 

"{0xCA761232, 0xED42, 0x11CE, {0xBA, 0xCD, 0x00, 0xAA, 0x00, 0x57, 0xB2, 0x23}}" 

3
কোন পরিস্থিতিতে প্রথম প্যাটার্নটি পাওয়া যাবে? অর্থাত্ একটি। নেট ফাংশন যা হাইফেনগুলি ছড়িয়ে দিতে পারে বা হাইফেন ছাড়াই জিইউইডি ফিরিয়ে দেবে?
গাই

1
আপনি এটি myGuid.ToString ("N") এর সাথে পেতে পারেন।
Panos

462

ইউইডের জন্য রেজিেক্সটি হ'ল:

\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b

19
যে তৈরি [a-f0-9]! এটি হেক্স হিসাবে! আপনার রেজেক্স (যেমন এটি) মিথ্যা ধনাত্মক প্রত্যাবর্তন করতে পারে।
এক্সহুমা

13
কিছু ক্ষেত্রে আপনি এমনকি এটি [a-fA-F0-9] বা [A-F0-9] তৈরি করতেও পারেন।
হ্যান্স-পিটার স্টার

22
@ সাইবার-সন্ন্যাসী: [0-9a-f] অর্থ এবং গতিতে [a-f0-9] এবং [0123456789abcdef] এর সাথে সমান, যেহেতু রেজেক্স যে কোনও উপায়ে একটি রাষ্ট্র মেশিনে রূপান্তরিত হয়েছে, প্রতিটি হেক্স ডিজিটের সাথে একটি রূপান্তরিত হয়েছে একটি রাষ্ট্র-টেবিল এন্ট্রি। কিভাবে এই কাজ করে মধ্যে একটি এন্ট্রি পয়েন্ট জন্য, দেখুন en.wikipedia.org/wiki/Nondeterministic_finite_automaton
JesperSM

10
এই সমাধানটি বেশ সঠিক নয়। এটি প্রতি আইএফসি 4122 অনুযায়ী অবৈধ সংস্করণ এবং বৈকল্পিক অক্ষর রয়েছে এমন আইডিগুলির সাথে মেলে। এই বিষয়ে @ গজাসের সমাধান আরও সঠিক। এছাড়াও, আরএফসি ইনপুট-এ বড় হাতের অক্ষরগুলিকে মঞ্জুরি দেয়, সুতরাং [এএফ] যুক্ত করা উপযুক্ত হবে।
ব্রুফা

4
@ ব্রোফা, আমি দেখতে পাচ্ছি যে আপনি আর ইউ সি-র সাথে সামঞ্জস্যপূর্ণ কেবল ইউইউডিগুলিতে মেলে প্রত্যেকের উপর সত্যিই সেট আপ। যাইহোক, আমি মনে করি যে আপনাকে এটিকে বহুবার নির্দেশ করতে হয়েছিল তা একটি দৃ indic় সূচক যা সমস্ত ইউইউডিগুলি আরএফসি সংস্করণ এবং বৈকল্পিক সূচক ব্যবহার করবে না। UUID সংজ্ঞা en.wikipedia.org/wiki/Uuid#Definition একটি সহজ 8-4-4-4-12 প্যাটার্ন এবং 2 ^ 128 সম্ভাবনার পদ বলে। আরএফসি কেবল এটির একটি উপসেট উপস্থাপন করে। তাহলে আপনি কি মেলাতে চান? সাবসেট, না সব?
ব্রুনো ব্রোনোস্কি

120

@ আইভলিন: ইউআইডি-র মূলধন থাকতে পারে। সুতরাং আপনার প্রয়োজন হয় পাওয়ারল কেস () স্ট্রিং বা ব্যবহার করতে হবে:

[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}

শুধু এটি মন্তব্য করতে পারে তবে যথেষ্ট প্রতিনিধি নয় :)


22
সাধারণত আপনি প্যাটার্নটির পরে আইটির সাথে সংবেদনশীল হিসাবে প্যাটার্নটি সংজ্ঞায়িত করে এটি পরিচালনা করতে পারেন, এটি একটি ক্লিনার প্যাটার্ন তৈরি করে: / [0-9a-f] {8} - [0-9a-f] {4} - [0 -9a-f] {4} - [0-9a-f] {4} - [0-9a-f] {12} / i
টমাস বিন্দজাস

@ থমাসবিন্দজাস এই বিকল্পটি সমস্ত ভাষায় উপলভ্য নয়। এই উত্তরের মূল প্যাটার্নটি আমার জন্য গোতে কাজ করেছে। /.../iসংস্করণ না।
ক্রিস রেডফোর্ড

110

সংস্করণ 4 ইউআইডিগুলিতে xxxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx ফর্ম রয়েছে যেখানে x কোনও হেক্সাডেসিমাল ডিজিট এবং y এর 8, 9, A, বা বি এর একটি যেমন f47ac10b-58cc-4372-a567-0e02b2c3d479।

উত্স: http://en.wikedia.org/wiki/Uuid# ডেফিনিশন

অতএব, এটি প্রযুক্তিগতভাবে আরও সঠিক:

/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/

আমি মনে করি না আপনি অ্যাজ মানে।
ব্রুনো ব্রোনোস্কি

8
[এএফ] এছাড়াও গ্রহণ করা দরকার। আরএফসি 4122 এর ধারা 3 অনুযায়ী: 'হেক্সাডেসিমাল মান "এ" এর মাধ্যমে "চ" এর মাধ্যমে নিম্ন কেসরে অক্ষর হিসাবে আউটপুট হয় এবং ইনপুটটিতে কেস সংবেদনশীল হয় ' এছাড়াও (:?8|9|A|B)সম্ভবত আরও কিছুটা পঠনযোগ্য[89aAbB]
ব্রুফা

1
@ ব্রুফার পরিবর্তনটি অনুলিপি করা দরকার; আপনার যেমন লোয়ার কেস এ বা বি বাদ দেয়
এলিওটিটিসিবল

6
@Elliottcable আপনার পরিবেশের উপর নির্ভর করে, কেবল i(কেস-সংবেদনশীল) পতাকা ব্যবহার করুন।
গাজুস

20
আপনি সংস্করণ 1 থেকে 3 এবং 5 প্রত্যাখ্যান করছেন কেন? কেন?
আইজিএল

90

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

মনে রাখবেন যে পার্থক্যটি হ'ল সংস্করণ নম্বর , যা ইউআইডি 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

নিদর্শনগুলি ছোট হাতের অক্ষরগুলিকে অন্তর্ভুক্ত করে না। এটি a-fপ্রতিটি A-Fসুযোগের পাশে থাকাও উচিত ।
পাউয়েস স্যাজটিć

27
iকেস অবশ যেমন Regex চিহ্ন শেষে।
johnhaley81

একটি প্যাটার্ন সংশোধক সর্বদা ব্যবহার করা যায় না। উদাহরণস্বরূপ, একটি ওপেনপি সংজ্ঞাতে, প্যাটার্নটি কেস সংবেদনশীল
স্টিফেন জ্যানিকাড

1
@ স্টাফেইন জ্যানিকাউড ওপেনপিআই-তে, ইউআইডিগুলি formatপরীক্ষা করার জন্য একটি রেইগেক্স
ইভান গ্যাব্রিয়েল ২

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

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

Gajus এর regexp বৈধ হওয়া সত্ত্বেও UID V1-3 এবং 5 প্রত্যাখ্যান করে।


1
তবে এটি অবৈধ সংস্করণগুলি (8 বা A এর মতো) এবং অবৈধ রূপগুলিকে অনুমতি দেয়।
ব্রিস

মনে রাখবেন যে [89AB] [0-9a-f] এ এবি হ'ল আপার কেস এবং বাকি অনুমোদিত অক্ষরগুলি নিম্ন কেস হয়। এটি পাইথনে আমাকে ধরা দিয়েছে
টনি সেপিয়া

17

[\w]{8}(-[\w]{4}){3}-[\w]{12} বেশিরভাগ ক্ষেত্রেই আমার পক্ষে কাজ করেছে।

অথবা আপনি যদি সত্যই নির্দিষ্ট হতে চান [\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}


3
এটি লক্ষণীয় যে জাভাতে \ ডাব্লু, কমপক্ষে _ পাশাপাশি হেক্সাডেসিমাল সংখ্যাগুলির সাথে মেলে। X পি {এক্সডিজিট with এর সাথে প্রতিস্থাপন করা আরও উপযুক্ত হতে পারে কারণ হেক্সাডেসিমাল সংখ্যাগুলির সাথে মিলে যাওয়ার জন্য পসিক্স ক্লাস নির্ধারিত। অন্যান্য ইউনিকোড অক্ষগুলি ব্যবহার করার সময় এটি ভেঙে যেতে পারে।
oconnor0

1
@ কনকনোরটির \wঅর্থ সাধারণত "শব্দের অক্ষর" এটি হেক্স-অঙ্কের চেয়ে অনেক বেশি মিলবে। আপনার সমাধানটি আরও ভাল। অথবা, সামঞ্জস্যতা / পাঠযোগ্যতার জন্য আপনি ব্যবহার করতে পারেন[a-f0-9]
এক্সহুমা

1
এখানে একটি স্ট্রিং যা একটি রেজেক্সের মতো দেখাচ্ছে এবং সেই নিদর্শনগুলির সাথে মেলে তবে এটি একটি অবৈধ রেজেক্স: 2wtu37k5-q174-4418-2cu2-276e4j82sv19
ট্র্যাভিস স্টিভেনস

@ ওলেট ট্র্যাভেলার সত্য নয়, এটি একটি কবজির মতো কাজ করে। import re def valid_uuid(uuid): regex = re.compile('[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}', re.I) match = regex.match(uuid) return bool(match) valid_uuid('2wtu37k5-q174-4418-2cu2-276e4j82sv19')
টমাসজ ওয়াজিক

3
@ টম সেই স্ট্রিং (2wt ...) একটি অবৈধ ইউআইইউড, তবে এই উত্তরে দেওয়া প্যাটার্নটি স্ট্রিংয়ের সাথে মেলে যে এটি একটি বৈধ ইউআইডি is এটি খুব খারাপ আমি জানি না কেন সেই ইউআইডিটি অবৈধ।
ট্র্যাভিস স্টিভেন্স 15

10

পাইথন রেতে, আপনি সংখ্যা থেকে শুরু করে বড় হাতের আলফা পর্যন্ত স্প্যান করতে পারেন। তাই ..

import re
test = "01234ABCDEFGHIJKabcdefghijk01234abcdefghijkABCDEFGHIJK"
re.compile(r'[0-f]+').findall(test) # Bad: matches all uppercase alpha chars
## ['01234ABCDEFGHIJKabcdef', '01234abcdef', 'ABCDEFGHIJK']
re.compile(r'[0-F]+').findall(test) # Partial: does not match lowercase hex chars
## ['01234ABCDEF', '01234', 'ABCDEF']
re.compile(r'[0-F]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-f]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-Fa-f]+').findall(test) # Good (with uppercase-only magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-9a-fA-F]+').findall(test) # Good (with no magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']

এটি সহজতম পাইথন ইউআইডিউইজেজেজকে তৈরি করে:

re_uuid = re.compile("[0-F]{8}-([0-F]{4}-){3}[0-F]{12}", re.I)

এগুলির পারফরম্যান্সের তুলনা করার জন্য টাইমিট ব্যবহার করার জন্য আমি এটি পাঠকের কাছে অনুশীলন হিসাবে রেখে দেব।

উপভোগ করুন। পাইথোনিক রাখুন ™!

দ্রষ্টব্য: এই স্প্যানগুলিও :;<=>?@'তাই মেলে , যদি আপনি সন্দেহ করেন যে আপনাকে মিথ্যা ধনাত্মকতা দিতে পারে তবে শর্টকাটটি নেবেন না। (মন্তব্যগুলিতে এটি উল্লেখ করার জন্য অলিভার অবার্টকে ধন্যবাদ।)


2
[0-এফ] প্রকৃতপক্ষে 0-9 এবং এএফ এর সাথে মিলবে, তবে এমন কোনও চরিত্রও যার ASCII কোড 57 (9 এর জন্য) এবং 65 (এ এর জন্য) এর মধ্যে রয়েছে, এর মধ্যে কোনওটি বলতে হবে:; <=>? @ '।
অলিভিয়ার অবার্ট

7
সুতরাং আপনি যদি বিবেচনা করতে চান তবে ব্যতীত উপরের বর্ণিত কোডটি ব্যবহার করবেন না: =>;? <;: - <@ =: - @ =; = - @; @: -> == @?> =:? @ @; একটি বৈধ UID হিসাবে :-)
অলিভিয়ার অবার্ট

9

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

http://en.wikipedia.org/wiki/Uuid#Definition


2
সঠিক না. আরএফসি 4122 কেবল [1-5] সংস্করণ অঙ্কের জন্য এবং [89aAbB] বৈকল্পিক অঙ্কের জন্য অনুমতি দেয়।
ব্রুফা

6

সুতরাং, আমি মনে করি রিচার্ড ব্রোনোস্কির কাছে তারিখের সর্বোত্তম উত্তর রয়েছে তবে আমি মনে করি আপনি এটিকে কিছুটা সহজ (বা কমপক্ষে পরিশ্রমী) করার জন্য কিছুটা করতে পারেন:

re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)

1
এমনকি টিডার:re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
পেড্রো গিমেনো

5

সি ++ এর জন্য বৈকল্পিক:

#include <regex>  // Required include

...

// Source string    
std::wstring srcStr = L"String with GIUD: {4d36e96e-e325-11ce-bfc1-08002be10318} any text";

// Regex and match
std::wsmatch match;
std::wregex rx(L"(\\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\\})", std::regex_constants::icase);

// Search
std::regex_search(srcStr, match, rx);

// Result
std::wstring strGUID       = match[1];

5

ওএস এক্স এর সাথে তৈরি ইউআইডিউডের জন্য uuidgen, রেজেক্স প্যাটার্নটি

[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}

দিয়ে যাচাই করুন

uuidgen | grep -E "[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}"

2
$UUID_RE = join '-', map { "[0-9a-f]{$_}" } 8, 4, 4, 4, 12;

বিটিডাব্লু, যে কোনও একটি পদে কেবল ৪ জনকে অনুমতি দেওয়া কেবল ইউআইডিভি 4 এর জন্য বৈধ। তবে ভি 4 কেবলমাত্র ইউইউডি সংস্করণ নয়। আমি আমার অনুশীলনেও ভি 1 এর সাথে দেখা করেছি।


1

যদি পসিক্স রেজেক্স ( grep -E, মাইএসকিউএল ইত্যাদি) ব্যবহার করা হয় তবে এটি পড়তে এবং মনে রাখা সহজ হতে পারে:

[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}

0

ব্যাশের জন্য:

grep -E "[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}"

উদাহরণ স্বরূপ:

$> echo "f2575e6a-9bce-49e7-ae7c-bff6b555bda4" | grep -E "[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}"
f2575e6a-9bce-49e7-ae7c-bff6b555bda4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.