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

Joe Medley
Joe Medley

Chrome 73 में String.prototype.matchAll() तरीके की सुविधा है. यह 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() (हर इटरेशन के लिए) दोनों के नतीजे, नाम वाली कुछ अतिरिक्त प्रॉपर्टी वाली अरे हैं. इस लेख को तैयार करते समय, मुझे पता चला है कि इन प्रॉपर्टी में एमडीएन (जिसे मैंने ठीक कर दिया है) पर दस्तावेज़ की कुछ कमियां हैं. यह रही इसके बारे में कम शब्दों में जानकारी.

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

नतीजा

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