ट्रैक
/
JavaScript
JavaScript
/
अभ्यास
/
रेगुलर एक्सप्रेशन चैटबॉट
रेगुलर एक्सप्रेशन चैटबॉट

रेगुलर एक्सप्रेशन चैटबॉट

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

परिचय

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

रेगुलर एक्सप्रेशन (या रेगेक्स) अक्षरों का एक क्रम है, जिसकी मदद से हम स्ट्रिंग में मौजूद कुछ खास चीज़ों को निशाना बनाकर उनमें बदलाव कर सकते हैं। इस तरह हम ये कर सकते हैं:

  • स्ट्रिंग में किसी टेक्स्ट को खोजना
  • स्ट्रिंग के अंदर मौजूद सबस्ट्रिंग को बदलना
  • स्ट्रिंग से जानकारी निकालना

💡 JavaScript का रेगेक्स फ्लेवर इस भाषा के ECMA-262 मानक का हिस्सा है। इसका मतलब है कि आपको ब्राउज़र-विशिष्ट कंपैटिबिलिटी की चिंता करने की ज़रूरत नहीं है।

रेगुलर एक्सप्रेशन बनाने का तरीका

JavaScript में रेगुलर एक्सप्रेशन ज़्यादातर /pattern/modifiers के रूप में लिखा जाता है।

रेगुलर एक्सप्रेशन बनाने के दो तरीके हैं:

  1. रेगुलर एक्सप्रेशन लिटरल:
const regex = /[a-z]/;
  1. कंस्ट्रक्टर RegExp:
const regex = new RegExp('[a-z]');

दोनों ही मामलों में JavaScript उस रेगेक्स से एक ऑब्जेक्ट बनाता है। सलाह यह है कि आप डिफ़ॉल्ट रूप से लिटरल के साथ अपरिवर्तनीय पैटर्न इस्तेमाल कीजिए।

RegExp कंस्ट्रक्टर उन मामलों में काम आता है जहाँ रेगेक्स बदलेगा, या जहाँ हमें अभी पता ही नहीं कि वह क्या होगा (जैसे किसी इनपुट में)।

🏴‍☠️ फ्लैग

रेगुलर एक्सप्रेशन के पास कुछ वैकल्पिक सुपरपावर होती हैं, जिन्हें flags कहते हैं और जो कुछ अतिरिक्त सुविधाएँ देती हैं।

इनमें से कुछ सबसे ज़्यादा इस्तेमाल किए जाने वाले हैं:

  • /g - ग्लोबल सर्च
  • /i - केस इनसेंसिटिव
  • /m - मल्टीलाइन सर्च

यहाँ एक आसान उदाहरण है:

const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);

=> // ["Home", "home"]

g अक्षर हमें स्ट्रिंग के सारे संभावित मैच निकालने देता है। अगर यह सुविधा न होती, तो JavaScript सिर्फ़ पहला Home मैच ही निकालता।

केस इनसेंसिटिव फ्लैग /i हमें पैटर्न ढूँढने में लचीला बनाता है। इससे फ़र्क नहीं पड़ता कि हम जो ढूँढ रहे हैं वह UPPERCASE में है या lowercase में।

RegExp कंस्ट्रक्टर इस्तेमाल करते समय फ्लैग जोड़ने का तरीका अलग होता है।

let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)

सबसे आम फंक्शन

जब रेगुलर एक्सप्रेशन को JavaScript के मौजूदा बिल्ट-इन फंक्शन के साथ मिलाया जाता है, तो हमारे पास स्ट्रिंग से डेटा निकालने और उसमें बदलाव करने के कुछ बहुत शक्तिशाली तरीके होते हैं।

ये कुछ ऐसे फंक्शन हैं जो रेगेक्स के साथ सबसे ज़्यादा इस्तेमाल होते हैं।

टेस्ट

test() मेथड एक रेगुलर एक्सप्रेशन और दी गई स्ट्रिंग के बीच मैच की खोज करता है। यह सही या गलत लौटाता है।

const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);

console.log(result);

// => true

मैच

match() मेथड से हमें एक काम का ऐरे मिलता है, जिसकी सामग्री इस पर निर्भर करती है कि मैच मिले हैं या नहीं।

इस तरह हम किसी भी स्ट्रिंग से जानकारी खोज भी सकते हैं और निकाल भी सकते हैं। उदाहरण के लिए:

const funnyQuote =
  'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;

funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]

funnyQuote.match(regex2);
// => null

जब ग्लोबल सर्च फ्लैग /g मौजूद होता है, तो यह मेथड इंडेक्स या इनपुट जैसी काम की जानकारी के साथ सिर्फ़ एक ही मैच देने के बजाय ऐरे में दिखने वाले सारे मैच लौटाता है:

const funnyQuote =
  'If you see someone crying, ask if it is because of their haircut.';

const regex3 = /if/gi;

funnyQuote.match(regex3);
// => ["If", "if"];

रिप्लेस

JavaScript का replace() मेथड हमें किसी दी गई स्ट्रिंग में एक वैल्यू ढूँढकर उसे अपनी मनचाही नई वैल्यू से बदलने देता है।

string.replace(searchValue, newValue);

खोज और बदलाव के लिए पैटर्न एक अकेली स्ट्रिंग भी हो सकती है और रेगुलर एक्सप्रेशन भी।

let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');

let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');

इसके अलावा, हम रिप्लेसमेंट की जगह एक फंक्शन भी लगा सकते हैं, ताकि हर वैल्यू में कुछ और बदलाव किए जा सकें।

let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
  return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"

स्प्लिट

JavaScript का split() मेथड रेगुलर एक्सप्रेशन के साथ स्ट्रिंग इस्तेमाल करने और उनमें बदलाव करने का एक अलग तरीका है।

इसमें हम किसी दी गई स्ट्रिंग को पैटर्न पहचानकर बाँटने के लिए रेगेक्स इस्तेमाल करते हैं, जैसे str.split(/[,.\s]/).

यही पैटर्न separator की तरह काम करता है।

const str = 'hello,user.how are.you';

const result = str.split(/[,.\s]/);

console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']

निर्देश

आपको एक ऐसी कंपनी में रेगुलर एक्सप्रेशन विशेषज्ञ के रूप में नौकरी मिली है जो एक चैटबॉट बना रही है।

चैटबॉट अभी विकास के बहुत शुरुआती चरण में है। इसलिए आपका काम है रेगुलर एक्सप्रेशन की मदद से चैटबॉट की यह क्षमता सुधारना कि वह प्राकृतिक भाषा को समझ सके और बना सके।

मान्य कमांड की जाँच कीजिए

चैटबॉट समझदार होने के साथ-साथ एक वफादार सहायक भी है।

चैटबॉट से कुछ पूछने के लिए उपयोगकर्ता को कमांड के सबसे पहले स्थान पर “Chatbot” शब्द कहना होगा।

इससे कोई फर्क नहीं पड़ता कि कीवर्ड बड़े अक्षरों में है या छोटे अक्षरों में। यहाँ मायने यह रखता है कि शब्द किस स्थान पर है।

फंक्शन isValidCommand() बनाइए, जो चैटबॉट को यह पहचानने में मदद करता है कि उपयोगकर्ता कोई कमांड दे रहा है।

isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True

एन्क्रिप्टेड इमोजी हटाइए

चैटबॉट को यह समझने में कठिनाई होती है कि इंसान अपनी भावनाएँ जताने के लिए इमोजी का इस्तेमाल कैसे करते हैं।

जब चैटबॉट को उपयोगकर्ता के संदेश मिलते हैं, तो हर इमोजी “emoji” के रूप में लिखा होता है, जिसके बाद उसका id नंबर आता है।

removeEmoji() मेथड बनाइए, जो एक स्ट्रिंग लेता है और पूरे संदेश में से इमोजी की सारी एन्क्रिप्शन हटा देता है।

जिन लाइनों में इमोजी का टेक्स्ट नहीं है, उन्हें बिना बदले ही लौटाया जाना चाहिए।

सिर्फ इमोजी स्ट्रिंग हटाइए। व्हाइटस्पेस को ठीक करने की कोशिश न कीजिए।

इस खास चैलेंज में रेगुलर एक्सप्रेशन बनाने के लिए कंस्ट्रक्टर सिंटैक्स का इस्तेमाल कीजिए।

removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames  it's one of my hobbies"

मान्य फोन नंबर की जाँच कीजिए

चूँकि चैटबॉट के फीचर मोबाइल ऐप पर डाउनलोड किए जा सकते हैं, इसलिए उम्मीद है कि उपयोगकर्ता बातचीत के दौरान एक फोन नंबर लिखेगा।

समस्या यह है कि चैटबॉट सिर्फ किसी खास फॉर्मैट वाले नंबर को ही पढ़ और जाँच सकता है।

अगर नंबर मान्य है (यानी रेगुलर एक्सप्रेशन में दिए गए अक्षरों के क्रम से मेल खाता है), तो चैटबॉट उपयोगकर्ता को धन्यवाद देते हुए और नंबर की पुष्टि करते हुए एक संदेश भेजता है। अगर नंबर मान्य नहीं है, तो फंक्शन उपयोगकर्ता को बताता है कि फोन नंबर मान्य नहीं है।

अपेक्षित फॉर्मैट यह है: (+##) ###-###-###

checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"

वेबसाइट का लिंक पाइए

चैटबॉट वाकई एक जिज्ञासु सॉफ्टवेयर है। हालाँकि वह किसी खास विषय के बारे में इंटरनेट पर खोज सकता है, फिर भी उसे उपयोगकर्ताओं से ऐसी अच्छी वेबसाइटों या URL के बारे में पूछना पसंद है, जहाँ जाकर वह काम की जानकारी ढूँढ सके।

बातचीत का उदाहरण:

  • Chatbot: अरे username, मैं JavaScript में कोडिंग करना सीखना चाहता हूँ, क्या आप ऐसी कोई अच्छी वेबसाइट जानते हैं जहाँ से मैं सीख सकूँ?
  • उपयोगकर्ता: मैंने exercism.org से बहुत कुछ सीखा

फंक्शन getURL() बनाइए, जो हर वेबसाइट के सिर्फ लिंक वाला एक ऐरे लौटाता है। किसी भी URL को पहचानने के लिए रेगेक्स लिखना बहुत जटिल होगा, लेकिन चैटबॉट को सिर्फ आसान URL पढ़ने होते हैं। इस अभ्यास में URL का मतलब शब्दों का कोई भी ऐसा क्रम है जो "." से अलग किया गया हो।

getURL(
  'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];

उपयोगकर्ता का अभिवादन कीजिए

जिन सभी लोगों से चैटबॉट ने बातचीत की है, उनका डेटा संग्रहीत करने के लिए चैटबॉट उपयोगकर्ता की प्रोफाइल से पूरा नाम इस तरह ले सकता है: “smith, john”।

इस तरह हम चाहते हैं कि हमारा चैटबॉट बहुत विनम्र रहे और अच्छी छाप छोड़े।

फंक्शन niceToMeetYou() लिखिए, जो उपयोगकर्ता के पूरे नाम वाली एक स्ट्रिंग लेता है और “Nice to meet you, John Smith” स्ट्रिंग लौटाता है।

सीखने के उद्देश्य से इस फंक्शन को रेगुलर एक्सप्रेशन के रिप्लेसमेंट मेथड की मदद से बनाइए।

let str = 'Smith, John';

niceToMeetYou(str);
// => "Nice to meet you, John Smith"
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
JavaScript Exercism

रेगुलर एक्सप्रेशन चैटबॉट शुरू करने के लिए तैयार हैं?

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