एक रेगुलर एक्सप्रेशन (या रेगेक्स) अक्षरों का एक ऐसा क्रम है जिसकी मदद से हम स्ट्रिंग में मौजूद कुछ खास एलिमेंट को निशाना बना सकते हैं और उन्हें बदल सकते हैं। इसकी मदद से हम:
यह कॉन्सेप्ट JavaScript में रेगुलर एक्सप्रेशन के इस्तेमाल पर केंद्रित है। अगर आप रेगुलर एक्सप्रेशन लिखना सीखना चाहते हैं, तो Eloquent JavaScript एक अच्छा संसाधन हो सकता है।
💡 JavaScript का रेगेक्स फ्लेवर भाषा के ECMA-262 स्टैंडर्ड का हिस्सा है। इसका मतलब है कि आपको ब्राउज़र के हिसाब से अलग-अलग कंपैटिबिलिटी की चिंता करने की ज़रूरत नहीं है।
JavaScript में रेगुलर एक्सप्रेशन ज़्यादातर /pattern/modifiers के रूप में लिखे जाते हैं, जहाँ 'pattern' मुख्य रेगेक्स होता है और 'modifiers' अक्षरों की वह श्रृंखला होती है जिसे हम खास विकल्प (जैसे सुपरपावर) बताने के लिए जोड़ सकते हैं।
फिर भी, रेगुलर एक्सप्रेशन बनाने के हमारे पास दो तरीके हैं:
const regex = /[a-z]/;
const regex = new RegExp('[a-z]');
दोनों ही मामलों में JavaScript उस रेगेक्स से एक ऑब्जेक्ट बनाता है। सलाह यह है कि डिफ़ॉल्ट रूप से लिटरल के साथ अपरिवर्तनीय पैटर्न इस्तेमाल किए जाएँ।
RegExp कंस्ट्रक्टर उन मामलों में इस्तेमाल किया जा सकता है जहाँ रेगेक्स बदलेगा या हमें अभी उसका पता नहीं है (जैसे कोई इनपुट)।
रेगुलर एक्सप्रेशन के पास कुछ वैकल्पिक सुपरपावर होते हैं, जिन्हें flags कहा जाता है और जो कुछ अतिरिक्त सुविधाएँ देते हैं। इन फ्लैग को अलग-अलग या साथ में, किसी भी क्रम में इस्तेमाल किया जा सकता है, और ये रेगुलर एक्सप्रेशन का ही हिस्सा होते हैं।
इनमें से ज़्यादा इस्तेमाल होने वाले कुछ ये हैं:
/g - वैश्विक खोज/i - केस-असंवेदनशील/m - बहुपंक्ति खोजयह एक आसान उदाहरण है:
const re = /home/gi;
const str = 'Home, sweet home.';
str.match(re);
// => ["Home", "home"]
g अक्षर हमें किसी स्ट्रिंग में मिलने वाले सारे मैच खोजने की सुविधा देता है। इस सुविधा के बिना JavaScript सिर्फ पहला Home मैच ही निकालता।
केस-असंवेदनशील फ्लैग /i पैटर्न खोजते समय हमें लचीला बनाता है। इससे फर्क नहीं पड़ता कि हम जो ढूँढ रहे हैं वह UPPERCASE में है या lowercase में।
RegExp कंस्ट्रक्टर इस्तेमाल करते समय फ्लैग जोड़ने का सिंटैक्स अलग होता है। ऐसे में हमें फ्लैग को दूसरे आर्गुमेंट के रूप में देना होता है।
जब रेगुलर एक्सप्रेशन को JavaScript के मौजूदा बिल्ट-इन फंक्शन के साथ मिलाया जाता है, तो स्ट्रिंग से डेटा निकालने और उसे बदलने के कुछ बहुत काम के तरीके हमारे पास आ जाते हैं।
test() मेथड यह खोजने का बढ़िया तरीका है कि किसी दी गई स्ट्रिंग के अंदर कोई वैल्यू मौजूद है या नहीं। यह एक बूलियन वैल्यू लौटाता है, true या false.
match() मेथड किसी दी गई स्ट्रिंग से रेगुलर एक्सप्रेशन का मैच निकालता है। यह जानकारी और मैचों वाला एक ऐरे लौटाता है।
किसे कब इस्तेमाल करें? जब आपको किसी स्ट्रिंग में कोई वैल्यू जल्दी जाँचनी हो तो test() इस्तेमाल कीजिए, और जब उस वैल्यू की ज़रूरत हो या मैच के बारे में ज़्यादा जानकारी चाहिए हो तो match() इस्तेमाल कीजिए।
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: 3, 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"
💡 अंत में, रेगुलर एक्सप्रेशन और
replace()मेथड का यह जोड़ एलिमेंट बदलने का ज़्यादा लचीला तरीका है। सिर्फ एक स्ट्रिंग इस्तेमाल करना सीमित पड़ सकता है।
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']
परफॉर्मेंस की बात करें तो दोनों ही एक RegExp ऑब्जेक्ट बनाते हैं। मुख्य फर्क यह है कि रेगेक्स कितनी बार कंपाइल होता है:
Regular Expression Literal के साथ: शुरुआत में कोड पार्स और कंपाइल होते समय सिर्फ एक बारRegExp() सिंटैक्स के साथ: हर बार जब नया ऑब्जेक्ट बनाया जाता है।लिटरल सिंटैक्स इस्तेमाल करना बेहतर विकल्प हो सकता है, सिर्फ परफॉर्मेंस की वजह से नहीं, बल्कि सादगी और पढ़ने में आसानी की वजह से भी। ज़्यादा जानकारी के लिए यह Stackoverflow चर्चा देखिए।
RegExp() कंस्ट्रक्टर इस्तेमाल करते समय आपको कोट्स को एस्केप करना होता है और बैकस्लैश को दोहरा एस्केप करना होता है। इससे रेगुलर एक्सप्रेशन, जो वैसे ही पढ़ने और समझने में मुश्किल होते हैं, और भी मुश्किल हो जाते हैं।