ট্র্যাক
/
Elixir
Elixir
/
সিলেবাস
/
রেগুলার এক্সপ্রেশন
রে

রেগুলার এক্সপ্রেশন মধ্যে Elixir

24টি অনুশীলনী

রেগুলার এক্সপ্রেশন সম্পর্কে

রেগুলার এক্সপ্রেশন (রেজেক্স) হলো Elixir-এ স্ট্রিং নিয়ে কাজ করার একটি শক্তিশালী হাতিয়ার। Elixir-এ রেগুলার এক্সপ্রেশন PCRE স্পেসিফিকেশন (Perl Compatible Regular Expressions) অনুসরণ করে। রেগুলার এক্সপ্রেশনের অর্থ প্রকাশ করে এমন স্ট্রিং প্যাটার্ন প্রথমে কম্পাইল করা হয়, তারপর স্ট্রিংয়ের সম্পূর্ণ বা আংশিক অংশ মেলাতে ব্যবহার করা হয়।

Elixir-এ রেগুলার এক্সপ্রেশন তৈরির সবচেয়ে কমন উপায় হলো ~r সিজিল ব্যবহার করা। সিজিল Elixir-এ কমন কাজের জন্য সিনট্যাকটিক সুগার শর্টকাট দেয়। এক্ষেত্রে ~r হলো Regex.compile!/2 ব্যবহারের একটি শর্টকাট।

Regex.compile!("test") == ~r/test/
# => true

=~/2 অপারেটরটি একটি স্ট্রিংয়ে রেজেক্স ম্যাচ চালিয়ে boolean ফলাফল রিটার্ন করতে কাজে লাগে।

"this is a test" =~ ~r/test/
# => true

রেজেক্স সিনট্যাক্স পর্যালোচনা

  • রেগুলার এক্সপ্রেশন প্যাটার্নে কিছু ক্যারেক্টারের বিশেষ অর্থ থাকে; কোনো ক্যারেক্টারকে সাধারণ অর্থে ব্যবহার করতে হলে \ দিয়ে এস্কেপ করতে হবে, যেমন ~r/\?/।
  • ক্যারেক্টার ক্লাস (যেমন \d, \w) প্যাটার্নকে একগুচ্ছ ক্যারেক্টারের সাথে মেলার সুযোগ দেয়
  • অল্টারনেশন (|) প্যাটার্নকে এক বা অন্য একটি প্যাটার্নের সাথে মেলার সুযোগ দেয়
  • কোয়ান্টিফায়ার ({N, M}, *, ?) প্যাটার্নকে নির্দিষ্ট সংখ্যক বার পুনরাবৃত্ত একটি প্যাটার্নের সাথে মেলার সুযোগ দেয়
  • গ্রুপ (()) প্যাটার্নের অংশগুলোকে একটি একক হিসেবে কাজ করার সুযোগ দেয়

ক্যাপচার

স্ট্রিংয়ের একটি অংশ বের করতেও রেগুলার এক্সপ্রেশন কাজে লাগে। একে বলা হয় ক্যাপচারিং। স্ট্রিংয়ের কোনো অংশ ক্যাপচার করতে যে অংশটি ক্যাপচার করতে চান তার জন্য একটি গ্রুপ (()) তৈরি করুন, তারপর Regex.run ব্যবহার করুন।

Regex.run(~r/Weight: (\d*)g/, "Weight: 150g")
# => ["Weight: 150g", "150"]

ক্যাপচারগুলো নম্বরযুক্ত (১ থেকে শুরু) এবং রেগুলার এক্সপ্রেশন দিয়ে স্ট্রিংয়ের অংশ প্রতিস্থাপন করার সময় এগুলো ফলাফলেও ব্যবহার করা যায়:

Regex.replace(~r/Weight: (\d*)g/, "Weight: 150g", "Gewicht: \\1g")
# => "Gewicht: 150g"

খোলা বন্ধনীর পরে ?<name> যোগ করে ক্যাপচারকে নামও দেওয়া যায়। নামযুক্ত ক্যাপচারসহ একটি ম্যাপ পেতে Regex.named_captures/3 ব্যবহার করুন।

Regex.named_captures(~r/Weight: (?<weight>\d*)g/, "Weight: 150g")
# => %{"weight" => "150"}

মডিফায়ার

রেগুলার এক্সপ্রেশনের শেষে বিশেষ ফ্ল্যাগ যোগ করে এর আচরণ বদলানো যায়, যেমন ~r/test/i।

  • caseless i - বড় হাতের ও ছোট হাতের অক্ষরের পার্থক্য করে না
    "A" =~ ~r/a/
    # => false
    "A" =~ ~r/a/i
    # => true
    
  • unicode u - \p-এর মতো Unicode-নির্দিষ্ট প্যাটার্ন চালু করে এবং \w ইত্যাদি ক্যারেক্টার ক্লাসকেও Unicode-এর সাথে মেলায়
    "ö" =~ ~r/^\w$/
    # => false
    "ö" =~ ~r/^\w$/u
    # => true
    
  • আরও আছে: dotall, multiline, extended, firstline, ungreedy

গতিশীলভাবে রেগুলার এক্সপ্রেশন তৈরি

যেহেতু ~r সিজিল হলো "pattern" |> Regex.escape() |> Regex.compile!()-এর একটি শর্টকাট, তাই স্ট্রিং ইন্টারপোলেশন ব্যবহার করেও গতিশীলভাবে একটি রেগুলার এক্সপ্রেশন প্যাটার্ন তৈরি করতে পারেন:

anchor = "$"
regex = ~r/end of the line#{anchor}/
"end of the line?" =~ regex
# => false
"end of the line" =~ regex
# => true

রেগুলার এক্সপ্রেশন বনাম String মডিউল

রেগুলার এক্সপ্রেশন শক্তিশালী হলেও সব সময় এগুলো ব্যবহার করা বুদ্ধিমানের কাজ নয়:

  • ব্যবহারের আগে এগুলো কম্পাইল করতে হয়, এতে কম্পিউটেশনের সময় ও মেমরি খরচ হয়।
  • সাধারণ স্ট্রিং ফাংশন ব্যবহারের তুলনায় এগুলো ধীর হতে পারে।

সাধারণ নিয়ম হিসেবে, যেখানে সম্ভব String মডিউলের ফাংশনগুলো ব্যবহার করাই ভালো।

# Don't use regular expressions to check a suffix:
if "YELLING!" =~ ~r/!$/, do: "Whoa, chill out!"

# Use a string function:
if String.ends_with?("YELLING!", "!"), do: "Whoa, chill out!"
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

রেগুলার এক্সপ্রেশন শিখুন

অনুশীলন লক করা আছে

রেগুলার এক্সপ্রেশন অনুশীলন করতে আরও 10টি অনুশীলনী আনলক করুন