रेगुलर एक्सप्रेशन (रेजेक्स) 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"]
कैप्चर की गिनती होती है (1 से शुरू), और रेगुलर एक्सप्रेशन से स्ट्रिंग के कुछ हिस्से बदलते समय नतीजे में भी इनका उपयोग किया जा सकता है:
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 जैसे यूनिकोड वाले पैटर्न चालू करता है और \w जैसी अक्षर क्लास को यूनिकोड पर भी मिलान करने देता है
"ö" =~ ~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!"