রেগুলার এক্সপ্রেশন (রেজেক্স) হলো 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!"