ट्रैक
/
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"]

कैप्चर की गिनती होती है (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!"
GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

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

अभ्यास लॉक है

रेगुलर एक्सप्रेशन पर अभ्यास करने के लिए 10 और अभ्यास अनलॉक कीजिए