ट्रैक
/
Elixir
Elixir
/
अभ्यास
/
तारीख पार्सर
तारीख पार्सर

तारीख पार्सर

सीखने का अभ्यास

परिचय

रेगुलर एक्सप्रेशन

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"

आप देखते हैं कि इन सबमें कुछ समानताएँ हैं, और आप कुछ ऐसे रेगुलर एक्सप्रेशन पैटर्न बनाने का फैसला करते हैं जिन्हें आपस में जोड़कर इस्तेमाल किया जा सके।

1. किसी तारीख से दिन, महीना और साल का मिलान कीजिए

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

2. सप्ताह के दिन और साल के महीने का मिलान कीजिए

day_names/0 और month_names/0 बनाइए जो एक स्ट्रिंग पैटर्न लौटाएँ, जिसे कम्पाइल करने पर क्रमशः सप्ताह के दिन के नाम और साल के महीने के नाम से मिलान हो।

"Tuesday" =~ DateParser.day_names() |> Regex.compile!()
# => true
"June" =~ DateParser.month_names() |> Regex.compile!()
# => true

3. दिन, महीना और साल को कैप्चर कीजिए

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"}

4. सारे कैप्चर जोड़कर पूरी तारीख कैप्चर कीजिए

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"}

5. कैप्चर को सीमित कीजिए ताकि वह सिर्फ तारीख से मिलान करे

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"
#   }
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Elixir Exercism

तारीख पार्सर शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Elixir को 58 कॉन्सेप्ट168 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।