String.prototype.matchAll() की मदद से बेहतर नतीजे पाना

Joe Medley
Joe Medley

Chrome 73 में String.prototype.matchAll() तरीका जोड़ा गया है. यह match() की तरह ही काम करता है. हालांकि, यह एक ऐसा इटरेट करता है जिसमें ग्लोबल या स्टिक रेगुलर एक्सप्रेशन में मौजूद सभी रेगुलर एक्सप्रेशन मैच शामिल होते हैं. इससे मैच को दोहराने का आसान तरीका मिलता है. खास तौर पर, जब आपको कैप्चर ग्रुप का ऐक्सेस चाहिए.

match() फ़ंक्शन में क्या गड़बड़ी है?

कम शब्दों में कहें, तो कुछ नहीं. हालांकि, अगर आपको कैप्चर करने वाले ग्रुप के साथ ग्लोबल मैच दिखाने हैं, तो ऐसा किया जा सकता है. यहां आपके लिए प्रोग्रामिंग से जुड़ी एक पहेली दी गई है. यहां दिया गया कोड देखें:

const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const results = string.match(regex);
console.log(results);
// → ['test1', 'test2']

इसे किसी कंसोल में चलाएं और देखें कि यह एक अरे दिखाता है, जिसमें 'test1' और 'test2' स्ट्रिंग शामिल हैं. अगर मैं रेगुलर एक्सप्रेशन से g फ़्लैग हटाऊं, तो मुझे कैप्चर करने वाले सभी ग्रुप मिलते हैं, लेकिन मुझे सिर्फ़ पहला मैच मिलता है. यह इस तरह दिखता है:

['test1', 'e', 'st1', '2', index: 0, input: 'test1test2', groups: undefined]

इस स्ट्रिंग में 'test2' से शुरू होने वाला दूसरा संभावित मैच है, लेकिन मेरे पास वह नहीं है. अब सवाल यह है: मैं हर मैच के लिए, कैप्चर करने वाले सभी ग्रुप कैसे पाऊं? String.prototype.matchAll() के प्रस्ताव के बारे में बताने वाले लेख में, दो संभावित तरीके बताए गए हैं. हम इनके बारे में नहीं बताएंगे, क्योंकि उम्मीद है कि आपको अब इनकी ज़रूरत नहीं पड़ेगी.

String.prototype.matchAll()

matchAll() के साथ, एक्सप्लेनर के उदाहरण कैसे दिखेंगे? एक नज़र डालें.

const regex = /t(e)(st(\d?))/g;
const string = 'test1test2';
const matches = string.matchAll(regex);
for (const match of matches) {
  console.log(match);
}

इस बारे में कुछ बातें ध्यान में रखें. match(), ग्लोबल सर्च पर ऐरे दिखाता है, जबकि matchAll() एक ऐसा इटरेट करता है जो for...of लूप के साथ बेहतर तरीके से काम करता है. इटरेटर, हर मैच के लिए एक कलेक्शन बनाता है. इसमें कुछ अतिरिक्त चीज़ों के साथ कैप्चरिंग ग्रुप भी शामिल होते हैं. अगर इन्हें कंसोल पर प्रिंट किया जाता है, तो ये इस तरह दिखेंगे:

['test1', 'e', 'st1', '1', index: 0, input: 'test1test2', groups: undefined]
['test2', 'e', 'st2', '2', index: 5, input: 'test1test2', groups: undefined]

आपको पता चल सकता है कि हर मैच की वैल्यू, एक ऐरे होती है. यह वैल्यू ठीक उसी फ़ॉर्मैट में होती है जैसा कि ग़ैर-ग्लोबल रेगुलर एक्सप्रेशन के लिए match() दिखाता है.

बोनस कॉन्टेंट

यह मुख्य रूप से उन लोगों के लिए है जो रेगुलर एक्सप्रेशन के बारे में नहीं जानते या जो इस विषय के विशेषज्ञ नहीं हैं. आपको पता चल गया होगा कि match() और matchAll() (हर बार के लिए) के नतीजे, नाम वाली कुछ अन्य प्रॉपर्टी वाले ऐरे होते हैं. इस लेख को तैयार करते समय, मुझे पता चला कि इन प्रॉपर्टी के लिए MDN पर दस्तावेज़ से जुड़ी कुछ कमियां हैं. मैंने इन्हें ठीक कर दिया है. यहां इस बारे में खास जानकारी दी गई है.

index
ओरिजनल स्ट्रिंग में पहले नतीजे का इंडेक्स. ऊपर दिए गए उदाहरण में, test2 पांचवीं पोज़िशन से शुरू होता है. इसलिए, index की वैल्यू पांच है.
input
वह पूरी स्ट्रिंग जिस पर matchAll() को चलाया गया था. मेरे उदाहरण में, यह 'test1test2' था.
groups
इसमें आपके रेगुलर एक्सप्रेशन में बताए गए, नाम वाले कैप्चरिंग ग्रुप के नतीजे शामिल होते हैं.

नतीजा

अगर हमने कुछ छूटा है, तो कृपया नीचे टिप्पणी करके हमें बताएं. JavaScript में हुए हाल ही के बदलावों के बारे में ज़्यादा जानने के लिए, पिछले अपडेट या V8 की वेबसाइट पर जाएं.