2009-05-09 11 views
60

g संशोधक सेट होने पर जावास्क्रिप्ट उप-मिलान क्यों काम करना बंद कर देते हैं?जावास्क्रिप्ट नियमित अभिव्यक्तियां और उप-मिलान

var text = 'test test test test'; 

var result = text.match(/t(e)(s)t/); 
// Result: ["test", "e", "s"] 

ऊपर काम करता है ठीक, result[1]"e" है और result[2]"s" है।

var result = text.match(/t(e)(s)t/g); 
// Result: ["test", "test", "test", "test"] 

उपरोक्त मेरे कैप्चरिंग समूहों को अनदेखा करता है। क्या निम्नलिखित एकमात्र वैध समाधान है?

var result = text.match(/test/g); 
for (var i in result) { 
    console.log(result[i].match(/t(e)(s)t/)); 
} 
/* Result: 
["test", "e", "s"] 
["test", "e", "s"] 
["test", "e", "s"] 
["test", "e", "s"] 
*/ 

उत्तर

91

का उपयोग String के match() समारोह वापसी पर कब्जा कर लिया जाएगा नहीं समूहों अगर वैश्विक संशोधक सेट किया गया है, जैसा कि आप में पता चला।

इस मामले में, आप RegExp ऑब्जेक्ट का उपयोग करना चाहते हैं और इसे exec() फ़ंक्शन पर कॉल करना चाहते हैं। String का match() लगभग RegExp के exec() फ़ंक्शन के समान है ... इन मामलों के अलावा। यदि वैश्विक संशोधक सेट किया गया है, तो सामान्य match() फ़ंक्शन कैप्चर किए गए समूहों को वापस नहीं करेगा, जबकि RegExp का exec() फ़ंक्शन होगा। (here प्रसिद्घ, अन्य स्थानों में।)

याद करने के लिए एक और पकड़ है कि exec() एक बड़ा सरणी-यह लौटने रहता मैचों में मैच वापस नहीं करता है जब तक यह पता चलता है, जिस स्थिति में यह रिटर्न null

var pattern = /t(e)(s)t/g; // Alternatively, "new RegExp('t(e)(s)t', 'g');" 
var match;  

while (match = pattern.exec(text)) { 
    // Do something with the match (["test", "e", "s"]) here... 
} 

नोट करने के लिए एक और बात है कि RegExp.prototype.exec() और RegExp.prototype.test() प्रदान की स्ट्रिंग पर नियमित अभिव्यक्ति निष्पादित और पहला परिणाम वापसी है:

तो, उदाहरण के लिए, आप कुछ इस तरह कर सकता है। प्रत्येक अनुक्रमिक कॉल स्ट्रिंग में वर्तमान स्थिति के आधार पर RegExp.prototype.lastIndex अपडेट करने वाले परिणाम सेट के माध्यम से कदम उठाएगी।

यहां एक उदाहरण है: // याद रखें उदाहरण और पैटर्न में 4 मैचों हैं। lastIndex 0

pattern.test(text); // pattern.lastIndex = 4 
pattern.test(text); // pattern.lastIndex = 9 
pattern.exec(text); // pattern.lastIndex = 14 
pattern.exec(text); // pattern.lastIndex = 19 

// if we were to call pattern.exec(text) again it would return null and reset the pattern.lastIndex to 0 
while (var match = pattern.exec(text)) { 
    // never gets run because we already traversed the string 
    console.log(match); 
} 

pattern.test(text); // pattern.lastIndex = 4 
pattern.test(text); // pattern.lastIndex = 9 

// however we can reset the lastIndex and it will give us the ability to traverse the string from the start again or any specific position in the string 
pattern.lastIndex = 0; 

while (var match = pattern.exec(text)) { 
    // outputs all matches 
    console.log(match); 
} 

पर आप कैसे RegExp वस्तुओं on the MDN (विशेष रूप से, यहां the exec() function के लिए दस्तावेज़ है) का उपयोग करने के बारे में जानकारी प्राप्त कर सकते हैं शुरू होता है।

+3

निष्पादन का उपयोग कर जी संशोधक को नहीं लगता है, लेकिन यह उप-मिलान/समूहों का समर्थन करता है। तो परिणाम पहला मैच होगा (यह मूल रूप से जी संशोधक को अनदेखा करता है) –

+0

इसके बारे में एक स्पष्टीकरण जोड़ा गया - आपको कई मैचों को प्राप्त करने के लिए बार-बार निष्पादन() को कॉल करना होगा। – hbw

+2

सबसे सुरुचिपूर्ण समाधान नहीं है। मैं इस तरह कुछ हद तक एक निर्गम उम्मीद कर रहा था: [ \t [ "परीक्षण", "ई", "एस"], \t [ "परीक्षण", "ई", "एस"], \t [ " परीक्षण "," ई "," एस "], \t [" परीक्षण "," ई "," एस "] ] –

संबंधित मुद्दे