রুবি রেগুলার এক্সপ্রেশন (রুবি রেজেক্স সংক্ষেপে) আপনাকে আরও প্রক্রিয়াকরণের জন্য ডেটা বের করার অভিপ্রায় সহ স্ট্রিংগুলির মধ্যে নির্দিষ্ট প্যাটার্নগুলি খুঁজে পেতে সহায়তা করে৷
রেগুলার এক্সপ্রেশনের জন্য দুটি সাধারণ ব্যবহারের ক্ষেত্রে রয়েছে যাচাইকরণ এবং পার্সিং।
উদাহরণস্বরূপ :
রুবি রেজেক্স সহ একটি ইমেল ঠিকানা সম্পর্কে চিন্তা করুন৷ আপনি একটি বৈধ ইমেল ঠিকানা দেখতে কেমন তা নির্ধারণ করতে পারেন। অন্য কথায়, আপনার প্রোগ্রাম একটি বৈধ এবং অবৈধ ইমেল ঠিকানার মধ্যে পার্থক্য বলতে সক্ষম হবে৷
রুবি রেগুলার এক্সপ্রেশন দুটি ফরোয়ার্ড স্ল্যাশের মধ্যে সংজ্ঞায়িত করা হয় অন্য ভাষার সিনট্যাক্স থেকে তাদের আলাদা করতে। সবচেয়ে সহজ অভিব্যক্তি একটি শব্দ বা এমনকি একটি একক অক্ষরের সাথে মেলে৷
উদাহরণস্বরূপ :
# 'like' শব্দটি খুঁজুন "আপনি কি বিড়াল পছন্দ করেন?" =~ /like/
এটি শব্দের প্রথম উপস্থিতির সূচী প্রদান করে যদি এটি পাওয়া যায় (সফল মিল) বা nil
অন্যথায় যদি আমরা সূচী সম্পর্কে চিন্তা না করি তাহলে আমরা স্ট্রিং#ইনক্লুড ব্যবহার করতে পারি? পদ্ধতি।
একটি স্ট্রিং একটি রেজেক্সের সাথে মেলে কিনা তা পরীক্ষা করার আরেকটি উপায় হল match
ব্যবহার করা পদ্ধতি:
যদি "আপনি কি বিড়াল পছন্দ করেন?"।match(/like/) লিখে "Match found!"end
এখন:
আপনি আরও উন্নত প্যাটার্ন তৈরি করতে শিখতে যাচ্ছেন যাতে আপনি তারিখ, ফোন নম্বর, ইমেল, URL, ইত্যাদির মতো জিনিসগুলিকে মেলাতে, ক্যাপচার করতে এবং প্রতিস্থাপন করতে পারেন৷
চরিত্রের ক্লাস
একটি অক্ষর শ্রেণী আপনাকে একটি পরিসর বা অক্ষরগুলির একটি তালিকা মেলাতে দেয়। উদাহরণস্বরূপ, [aeiou]
যেকোনো স্বরবর্ণের সাথে মিলে যায়।
উদাহরণ :স্ট্রিং কি ধারণ করে একটি স্বরবর্ণ?
def contains_vowel(str) str =~ /[aeiou]/endcontains_vowel("test") # রিটার্ন 1contains_vowel("sky") # রিটার্ন শূন্য
এটি পরিমাণকে বিবেচনা করবে না অক্ষরগুলির মধ্যে, আমরা শীঘ্রই এটি কীভাবে করব তা দেখব৷
পরিসীমা
আমরা তাদের সব টাইপ না করেই একাধিক অক্ষর বা সংখ্যার সাথে মেলে রেঞ্জ ব্যবহার করতে পারি। অন্য কথায়, [2-5]
এর মতো একটি পরিসর [2345]
এর মতই .
কিছু দরকারী ব্যাপ্তি:
- [0-9] 0 থেকে 9 পর্যন্ত যেকোনো সংখ্যার সাথে মেলে
- [a-z] a থেকে z পর্যন্ত যেকোনো অক্ষরের সাথে মেলে (কোন ক্যাপ নেই)
- [^a-z] নেগেটেড রেঞ্জ
উদাহরণ :এই স্ট্রিংটিতে কি কোন সংখ্যা আছে?
def contains_number(str) str =~ /[0-9]/endcontains_number("The year is 2015") # ফেরত দেয় 12contains_number("The cat is black") # শূন্য ফেরত দেয়
মনে রাখবেন:`=~` ব্যবহার করার সময় রিটার্ন মান হয় স্ট্রিং ইনডেক্স বা `nil`
অক্ষর পরিসীমা নির্দিষ্ট করার জন্য একটি সুন্দর সংক্ষিপ্ত বাক্য গঠন আছে:
- \w [0-9a-zA-Z_] এর সমতুল্য
- \d [0-9] এর মতই
- \s মেলে সাদা স্থান (ট্যাব, নিয়মিত স্থান, নতুন লাইন)
এর নেতিবাচক রূপও রয়েছে:
- \W [0-9a-zA-Z_>-এ নেই এমন কিছু
- \D কোন কিছু যা একটি সংখ্যা নয়
- \S এমন কিছু যা একটি স্থান নয়
বিন্দু অক্ষর .
নতুন লাইন ছাড়া সবকিছু মেলে। আপনি যদি একটি আক্ষরিক .
ব্যবহার করতে চান তাহলে আপনাকে এড়িয়ে যেতে হবে।
উদাহরণ :বিশেষ অক্ষর পালানো
# যদি আমরা পালাতে না পারি, তাহলে অক্ষরটি "5a5" এর সাথে মিলবে (/\d.\d/)# এই ক্ষেত্রে শুধুমাত্র আক্ষরিক বিন্দুটি "5a5" এর সাথে মিলে যায় (/\d\.\) d/) # শূন্য"5.5" ম্যাচ(/\d\.\d/) # ম্যাচ
সংশোধনকারী
এখন পর্যন্ত আমরা একটি সময়ে শুধুমাত্র একটি একক অক্ষর মেলাতে সক্ষম হয়েছি। একাধিক অক্ষর মেলানোর জন্য আমরা প্যাটার্ন মডিফায়ার ব্যবহার করতে পারি।
সংশোধনকারী | বর্ণনা |
---|---|
+ | 1 বা তার বেশি |
* | 0 বা তার বেশি |
? | 0 বা 1 |
{3,5} | 3 এবং 5 এর মধ্যে |
আরও জটিল রেগুলার এক্সপ্রেশন তৈরি করতে আমরা এখন পর্যন্ত যা কিছু শিখেছি তা একত্রিত করতে পারি।
উদাহরণ :এটি কি একটি আইপি ঠিকানার মত দেখাচ্ছে?
# মনে রাখবেন যে এটি কিছু অবৈধ আইপি ঠিকানার সাথে মিলবে# যেমন 999.999.999.999, কিন্তু এই ক্ষেত্রে আমরা শুধুমাত্র format.def ip_address?(str) # ব্যবহার করি !! রিটার্ন মানটিকে বুলিয়ানে রূপান্তর করতে !!(str =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} $/)endip_address?("192.168.1.1") # trueip_address ফেরত দেয়?("0000.0000") # মিথ্যা ফেরত দেয়
সঠিক স্ট্রিং ম্যাচিং
আপনার যদি সঠিক মিলের প্রয়োজন হয় তবে আপনাকে অন্য ধরণের সংশোধকের প্রয়োজন হবে। আসুন একটি উদাহরণ দেখি যাতে আপনি দেখতে পারেন আমি কী সম্পর্কে কথা বলছি:
# আমরা খুঁজতে চাই এই স্ট্রিংটি ঠিক চারটি অক্ষর লম্বা কিনা, এটি# এখনও মিলবে কারণ এতে চারটির বেশি আছে, কিন্তু আমরা যা চাই তা নয়।" Regex দুর্দান্ত।" ম্যাচ /\w{4}/ # পরিবর্তে আমরা 'রেখার শুরু' এবং 'রেখার শেষ' মডিফায়ারগুলি ব্যবহার করব"রেজেক্স দুর্দান্ত"।match /^\w{4}$/# এবার এটি মিলবে না। এটি একটি বরং কল্পিত উদাহরণ, যেহেতু আমরা দৈর্ঘ্য বের করতে .size ব্যবহার করতে পারতাম, কিন্তু আমি মনে করি এটি জুড়ে ধারণা পায়৷
একটি স্ট্রিংয়ের শুরুতে কঠোরভাবে মেলে এবং শুধুমাত্র প্রতিটি লাইনে নয় (একটি \n
পরে ) আপনাকে \A
ব্যবহার করতে হবে এবং \Z
^
এর পরিবর্তে এবং $
.
গ্রুপ ক্যাপচার করুন
ক্যাপচার গ্রুপের মাধ্যমে, আমরা একটি ম্যাচের অংশ ক্যাপচার করতে পারি এবং পরে এটি পুনরায় ব্যবহার করতে পারি। একটি ম্যাচ ক্যাপচার করার জন্য আমরা যে অংশটি বন্ধনীতে ক্যাপচার করতে চাই সেটি আবদ্ধ করি।
উদাহরণ :একটি লগ ফাইল পার্সিং
লাইন =Struct.new(:time, :type, :msg)LOG_FORMAT =/(\d{2}:\d{2}) (\w+) (.*)/def parse_line(line) লাইন। মিল (LOG_FORMAT) { |m| Line.new(*m.captures) }endparse_line("12:41 INFO ব্যবহারকারী লগ ইন করেছে।")# এটি এই ধরনের বস্তু তৈরি করে:#
এই উদাহরণে, আমরা .match
ব্যবহার করছি =~
এর পরিবর্তে .
এই পদ্ধতিটি একটি MatchData
প্রদান করে বস্তু যদি একটি মিল থাকে, অন্যথায় শূন্য. MatchData
ক্লাসের অনেক দরকারী পদ্ধতি আছে, আরও জানতে ডকুমেন্টেশন দেখুন!
আপনি যদি শুধু একটি বুলিয়ান মান চান (true
/ false
) তাহলে আপনি match?
ব্যবহার করতে পারেন পদ্ধতি, যা রুবি 2.4 থেকে উপলব্ধ। এটি match
থেকেও দ্রুত যেহেতু রুবিকে একটি MatchData
তৈরি করতে হবে না বস্তু।
আপনি .captures
ব্যবহার করে ক্যাপচার করা ডেটা অ্যাক্সেস করতে পারেন পদ্ধতি বা MatchData
এর চিকিৎসা একটি অ্যারের মতো বস্তু, শূন্য সূচকের সম্পূর্ণ মিল থাকবে এবং ফলস্বরূপ সূচীতে মিলিত গোষ্ঠীগুলি থাকবে৷
আপনি যদি প্রথম ক্যাপচার গ্রুপ চান তবে আপনি এটি করতে পারেন:
m ="John 31."match /\w+ (\d+)/m[1]# 31
আপনি নন-ক্যাপচারিং গ্রুপও রাখতে পারেন। তারা আপনাকে পারফরম্যান্স পেনাল্টি ছাড়াই একত্রে প্রকাশ করতে দেবে। আপনি জটিল অভিব্যক্তিগুলি পড়তে সহজ করার জন্য নামযুক্ত গোষ্ঠীগুলিও দরকারী খুঁজে পেতে পারেন৷
সিনট্যাক্স | বর্ণনা |
---|---|
(?:...) | নন-ক্যাপচারিং গ্রুপ |
(?<foo>...) | নামযুক্ত গ্রুপ |
উদাহরণ :নামযুক্ত গোষ্ঠীগুলি
m ="David 30."match /(?\w+) (?\d+)/m[:age]# => "30"m[:name]# => "David"
একটি নামযুক্ত গ্রুপ একটি MatchData
প্রদান করে আপনি ফলাফল পড়তে অ্যাক্সেস করতে পারেন যে বস্তু.
আগে তাকান এবং পিছনে তাকান
এটি একটি আরও উন্নত কৌশল যা সমস্ত রেজেক্স বাস্তবায়নে উপলব্ধ নাও হতে পারে। রুবির রেগুলার এক্সপ্রেশন ইঞ্জিন এটি করতে সক্ষম, তাই আসুন দেখি কিভাবে এর সুবিধা নেওয়া যায়।
সামনে দেখুন আমাদের উঁকি দিতে এবং আগে বা পরে একটি নির্দিষ্ট মিল আছে কিনা তা দেখতে দেয়৷
নাম | বর্ণনা |
---|---|
(?=pat) | ইতিবাচক দৃষ্টিভঙ্গি |
(?<=pat) | ইতিবাচক চেহারা পিছনে |
(?!pat) | নেতিবাচক দৃষ্টিভঙ্গি |
(? | নেতিবাচক চেহারা পিছনে |
উদাহরণ :অন্তত একটি অক্ষরের আগে একটি সংখ্যা আছে?
def number_after_word?(str) !!(str =~ /(?<=\w) (\d+)/)endnumber_after_word?("গ্রেড 99")
রুবির রেজেক্স ক্লাস
রুবি রেগুলার এক্সপ্রেশন হল Regexp
এর উদাহরণ ক্লাস বেশিরভাগ সময় আপনি এই ক্লাসটি সরাসরি ব্যবহার করবেন না, তবে জেনে রাখা ভালো 🙂
/a/.class# Regexpরাখে
একটি সম্ভাব্য ব্যবহার হল একটি স্ট্রিং থেকে একটি রেজেক্স তৈরি করা:
regexp =Regexp.new("a")
একটি regexp তৈরি করার আরেকটি উপায়:
regexp =%r{\w+}
রেজেক্স বিকল্প
আপনি আপনার রেগুলার এক্সপ্রেশনে কিছু বিকল্প সেট করতে পারেন যাতে এটি ভিন্নভাবে আচরণ করে।
বিকল্পগুলি | বিবরণ |
---|---|
i | রুবি রেজেক্স কেস সংবেদনশীল নয় |
m | ডট মেলে নিউলাইন |
x | হোয়াইটস্পেস উপেক্ষা করুন |
এই বিকল্পগুলি ব্যবহার করার জন্য আপনি regex এর শেষে অক্ষরটি যোগ করুন, /
বন্ধ করার পরে .
এরকম :
"abc. ম্যাচ?(/[A-Z]/i)
লং রেগুলার এক্সপ্রেশন ফরম্যাটিং
কমপ্লেক্স রুবি রেগুলার এক্সপ্রেশনগুলি পড়তে বেশ কঠিন হতে পারে, তাই আমরা সেগুলিকে একাধিক লাইনে বিভক্ত করলে এটি সহায়ক হবে। আমরা 'x' মডিফায়ার ব্যবহার করে এটি করতে পারি। এই বিন্যাসটি আপনাকে আপনার রেজেক্সের মধ্যে মন্তব্য ব্যবহার করার অনুমতি দেয়।
উদাহরণ :
LOG_FORMAT =%r{ (\d{2}:\d{2}) # সময় \s(\w+) # ইভেন্টের ধরন \s(.*) # বার্তা}x
রুবি রেজেক্স:সবকিছু একসাথে রাখা
অনেক রুবি পদ্ধতিতে নিয়মিত এক্সপ্রেশন ব্যবহার করা যেতে পারে।
- .বিভক্ত
- .স্ক্যান করুন
- .gsub
- এবং আরো অনেক...
উদাহরণ :.scan
ব্যবহার করে একটি স্ট্রিং থেকে সমস্ত শব্দ মিলান"এটি কিছু স্ট্রিং।উদাহরণ :একটি স্ট্রিং থেকে সমস্ত সংখ্যা বের করুন
"বছরটি ছিল 1492।".scan(/\d+/)# => ["1492"]উদাহরণ :একটি স্ট্রিং-এ সমস্ত শব্দ বড় করুন
str ="লর্ড অফ দ্য রিংস"str.gsub(/\w+/) { |w| w.capitalize }# => "লর্ড অফ দ্য রিংস"উদাহরণ :একটি ইমেল ঠিকানা যাচাই করুন
email ="[email protected]"!!email.match(/\A[\w.+-]+@\w+\.\w+\z/)# সত্যএই শেষ উদাহরণটি
!!
ব্যবহার করে ফলাফলটিকে একটি বুলিয়ান মান (true
) এ রূপান্তর করতে /false
), বিকল্পভাবে আপনিmatch?
ব্যবহার করতে পারেন রুবি 2.4+ এ পদ্ধতি যা ইতিমধ্যেই আপনার জন্য এটি করে এবং এটি আরও দ্রুত।উপসংহার
নিয়মিত অভিব্যক্তি আশ্চর্যজনক কিন্তু কখনও কখনও তারা একটি বিট চতুর হতে পারে. rubular.com-এর মতো একটি টুল ব্যবহার করা আপনাকে আপনার রুবি রেজেক্স তৈরি করতে সাহায্য করতে পারে আরও ইন্টারেক্টিভ উপায়ে। রুবুলারে একটি রুবি রেগুলার এক্সপ্রেশন চিট শীটও রয়েছে যা আপনি খুব দরকারী পাবেন। এখন আপনার পালা সেই সম্পাদকটি খুলুন এবং কোডিং শুরু করুন!
ওহ, এবং এটি শেয়ার করতে ভুলবেন না আপনি যদি এটি উপভোগ করেন তবে আপনার বন্ধুদের সাথে, যাতে আরও লোকেরা শিখতে পারে 🙂