2009-10-07 14 views
5

मुझे पता है कि कुछ रेगेक्स/lastIndex विसंगतियां हैं लेकिन यह मेरे लिए नया है!रेगेक्स/अंतिम इंडेक्स - अप्रत्याशित व्यवहार

अपेक्षित व्यवहार: एक नया नियमित अभिव्यक्ति (शाब्दिक/निर्माता के साथ) बनाना होगा, जाहिर है, एक नया RegExp ऑब्जेक्ट एक lastIndex संपत्ति शून्य पर सेट के साथ पैदा करते हैं।

वास्तविक व्यवहार: (एफएफ, क्रोम में): अंतिम इंडेक्स संपत्ति एकाधिक RegExp रचनाओं के माध्यम से जारी रहती है।

उदा।

function foo(s) { 

    // A *NEW* regular expression 
    // is created on each call of foo(): 
    var regex = /ABC/g; 

    document.write(regex.lastIndex + '<br/>'); 

    // regex.test() updates lastIndex property 
    regex.test(s); 

    // This is where the regex's life should end... 
    // (Why does it persist?) 

} 

foo('ABC'); 
foo('ABCABC'); 
foo('ABCABCABC'); 

यहाँ देखें: http://jsbin.com/otoze


एक नया RegExp ऑब्जेक्ट हर कार्य कॉल (? दाएं), तो क्यों दस्तावेज़ में लिखा जा रहा पीछा कर रहा है पर बनाया जा रहा है ?? -

0 
3 
6 

???

नोट, यह अजीबता एफएफ (3) और क्रोम (2) में होती है, लेकिन उत्सुकता से आईई नहीं है।

क्या यह अपेक्षित व्यवहार है, क्या आईई इसे गलत या सही बनाता है? क्या यह एक प्रसिद्ध बग है?


संपादित करें: इस जब एक शाब्दिक के बजाय एक निर्माता के साथ regex instantiating हो प्रतीत नहीं होता है। जैसे new RegExp('ABC','g'); ... फिर भी, शाब्दिक (सैद्धांतिक रूप से) काम करना चाहिए, है ना?

उत्तर

5

var regex = new RegExp("ABC", "g"); में यह समस्या नहीं है, इसलिए मुझे लगता है कि /ABC/g regexp ऑब्जेक्ट्स का पुन: उपयोग करता है।

संपादित करें: जाहिर है यह ECMAScript 3.0 विनिर्देश के अनुसार सही व्यवहार है, यह ECMAScript 3.1 में ठीक किया गया है - details

+0

मेरा अनुमान भी अजीब है कि ... फिर भी ... – James

+0

@ जेपी: यह वास्तव में अजीब नहीं है, आपने कभी भी 'नया' कीवर्ड का उपयोग नहीं किया है। – Chris

+0

अजीब बात यह है कि यदि आप फ़ंक्शन में एक ही कोड को कई बार कॉल करते हैं, तो यह सही आउटपुट वापस कर देगा। ऐसा लगता है कि यह उसी कार्य के बाद की कॉल में कुछ असाइनमेंट को गलत तरीके से अनुकूलित करता है। –

1

इस प्रयास करें:

function foo(s) { 

    // A *NEW* regular expression 
    // is created on each call of foo(): 
    var regex = new RegEx("ABC", "g"); 

    document.write(regex.lastIndex + '<br/>'); 

    // regex.test() updates lastIndex property 
    regex.test(s); 

    // This is where the regex's life should end... 
    // (Why does it persist?) 

} 

foo('ABC'); 
foo('ABCABC'); 
foo('ABCABCABC'); 
संबंधित मुद्दे