Elixir में स्ट्रिंग के साथ काम करने के लिए रेगुलर एक्सप्रेशन (रेगेक्स) एक शक्तिशाली टूल हैं। Elixir में रेगुलर एक्सप्रेशन PCRE स्पेसिफिकेशन (Perl Compatible Regular Expressions) का पालन करते हैं। रेगुलर एक्सप्रेशन का अर्थ बताने वाले स्ट्रिंग पैटर्न पहले कंपाइल किए जाते हैं और फिर किसी स्ट्रिंग के पूरे या किसी हिस्से से मिलान करने के लिए इस्तेमाल होते हैं।
Elixir में रेगुलर एक्सप्रेशन बनाने का सबसे आम तरीका ~r सिगिल का उपयोग करना है। सिगिल Elixir के आम कामों के लिए सिंटैक्टिक शुगर शॉर्टकट देते हैं। किसी स्ट्रिंग लिटरल से मिलान करने के लिए हम सिगिल के बाद उसी स्ट्रिंग को पैटर्न की तरह लिख सकते हैं।
~r/test/
किसी स्ट्रिंग पर रेगेक्स मिलान करके boolean परिणाम लौटाने के लिए =~/2 ऑपरेटर काम आता है।
"this is a test" =~ ~r/test/
# => true
सिगिल इस्तेमाल करने के बारे में दो बातें:
/ के अलावा कई दूसरे डिलिमिटर भी इस्तेमाल किए जा सकते हैं\) को एस्केप करना पड़ेगाचौकोर ब्रैकेट [] से अक्षरों की एक रेंज का मिलान करने पर एक अक्षर क्लास बनती है। यह क्लास में मौजूद अक्षरों में से किसी एक अक्षर से मिलान करती है। आप a-z जैसी अक्षर रेंज भी दे सकते हैं, बशर्ते शुरू और अंत के अक्षर कोड पॉइंट की एक लगातार रेंज बनाते हों।
regex = ~r/[a-z][ADKZ][0-9][!?]/
"jZ5!" =~ regex
# => true
"jB5?" =~ regex
# => false
संक्षिप्त अक्षर क्लास पैटर्न को और छोटा बना देती हैं। उदाहरण के लिए:
\d, [0-9] का छोटा रूप (कोई भी अंक)\w, [A-Za-z0-9_] का छोटा रूप (कोई भी 'शब्द' अक्षर)\s, [ \t\r\n\f] का छोटा रूप (कोई भी व्हाइटस्पेस अक्षर)जब संक्षिप्त अक्षर क्लास सिगिल के बाहर इस्तेमाल होती है, तो उसे एस्केप करना ज़रूरी होता है: "\\d"
एल्टरनेशन में | एक विशेष अक्षर की तरह इस्तेमाल होता है, जो बताता है कि एक या दूसरे से मिलान होना चाहिए
regex = ~r/cat|bat/
"bat" =~ regex
# => true
"cat" =~ regex
# => true
क्वांटिफायर रेगेक्स में किसी पैटर्न को बार-बार दोहराने की सुविधा देते हैं। इनका असर उस ग्रुप पर पड़ता है जो क्वांटिफायर से ठीक पहले आता है।
{N, M} जहाँ N कम से कम दोहराव की संख्या है और M सबसे ज़्यादा{N,} N या उससे ज़्यादा दोहराव से मिलान
{0,} को * की तरह भी लिखा जा सकता है: शून्य या उससे ज़्यादा दोहराव से मिलान{1,} को + की तरह भी लिखा जा सकता है: एक या उससे ज़्यादा दोहराव से मिलान{,N} N तक दोहराव से मिलानगोल ब्रैकेट () का उपयोग ग्रुप और कैप्चर दिखाने के लिए किया जाता है। कुछ मौकों पर ग्रुप को कैप्चर भी किया जा सकता है, ताकि उसे आगे इस्तेमाल के लिए लौटाया जा सके। Elixir में इन्हें नाम दिया जा सकता है या बिना नाम के छोड़ा जा सकता है। कैप्चर को नाम देने के लिए खुलने वाले ब्रैकेट के बाद ?<name> लगाया जाता है। ग्रुप एक ही इकाई की तरह काम करता है, जैसे जब उसके बाद क्वांटिफायर आते हैं।
regex = ~r/(h)at/
Regex.replace(regex, "hat", "\\1op")
# => "hop"
regex = ~r/(?<letter_b>b)/
Regex.scan(regex, "blueberry", capture: :all_names)
# => [["b"], ["b"]]
एंकर रेगुलर एक्सप्रेशन को उस स्ट्रिंग के शुरू या अंत से बाँधने के लिए इस्तेमाल होते हैं जिससे मिलान करना है:
^ स्ट्रिंग के शुरू से बाँधता है$ स्ट्रिंग के अंत से बाँधता हैचूँकि ~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
आपको एक ऐसी सेवा लिखने का काम दिया गया है जो ईवेंट लेती है। हर ईवेंट के साथ एक तारीख जुड़ी होती है, लेकिन आपका ध्यान जाता है कि आपकी सेवा के एंडपॉइंट पर 3 अलग-अलग फॉर्मैट में तारीखें भेजी जा रही हैं:
"01/01/1970""January 1, 1970""Thursday, January 1, 1970"आप देखते हैं कि इन सबमें कुछ समानताएँ हैं, और आप कुछ ऐसे रेगुलर एक्सप्रेशन पैटर्न बनाने का फैसला करते हैं जिन्हें आपस में जोड़कर इस्तेमाल किया जा सके।
day/0, month/0 और year/0 बनाइए जो एक स्ट्रिंग पैटर्न लौटाएँ, जिसे कम्पाइल करने पर "01/01/1970" (dd/mm/yyyy) के संख्यात्मक हिस्सों से मिलान हो। दिन और महीना 1 या 01 (बाईं ओर शून्य लगाकर) के रूप में आ सकते हैं।
"31" =~ DateParser.day() |> Regex.compile!()
# => true
"12" =~ DateParser.month() |> Regex.compile!()
# => true
"1970" =~ DateParser.year() |> Regex.compile!()
# => true
day_names/0 और month_names/0 बनाइए जो एक स्ट्रिंग पैटर्न लौटाएँ, जिसे कम्पाइल करने पर क्रमशः सप्ताह के दिन के नाम और साल के महीने के नाम से मिलान हो।
"Tuesday" =~ DateParser.day_names() |> Regex.compile!()
# => true
"June" =~ DateParser.month_names() |> Regex.compile!()
# => true
capture_day/0, capture_month/0, capture_year/0, capture_day_name/0, capture_month_name/0 बनाइए जो एक स्ट्रिंग पैटर्न लौटाएँ जो संबंधित हिस्सों को इन नामों के तहत कैप्चर करे: "day", "month", "year", "day_name", "month_name"
DateParser.capture_month_name()
|> Regex.compile!()
|> Regex.named_captures("December")
# => %{"month_name" => "December"}
capture_numeric_date/0, capture_month_name_date() और capture_day_month_name_date/0 बनाइए जो एक स्ट्रिंग पैटर्न लौटाएँ जो भाग 3 के हिस्सों को संबंधित तारीख फॉर्मैट का उपयोग करके कैप्चर करे:
"01/01/1970"
"January 1, 1970"
"Thursday, January 1, 1970"
DateParser.capture_numeric_date()
|> Regex.compile!()
|> Regex.named_captures("01/01/1970")
# => %{"day" => "01", "month" => "01", "year" => "1970"}
match_numeric_date/0, match_month_name_date/0 और match_day_month_name_date/0 बनाइए जो एक कम्पाइल किया हुआ रेगुलर एक्सप्रेशन लौटाएँ जो सिर्फ तारीख से मिलान करे और उसके हिस्सों को भी कैप्चर कर सके।
"Thursday, January 1, 1970 was the Unix epoch." =~ DateParser.match_day_month_name_date()
# => false
"Thursday, January 1, 1970" =~ DateParser.match_day_month_name_date()
# => true
DateParser.match_day_month_name_date()
|> Regex.named_captures("Thursday, January 1, 1970")
# => %{
# "day" => "1",
# "day_name" => "Thursday",
# "month_name" => "January",
# "year" => "1970"
# }
Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।