दिलचस्प पोस्ट
सरणी में स्ट्रिंग कैसे डालनी है, नई लाइन से विभाजित? एन्कोडिंग का पता लगाएं और सब कुछ UTF-8 करें JQuery के साथ ईवेंट हैंडलर्स के लिए बाध्य कार्यों को एक्सेस करना "कौन ऑनलाइन है" रेलवे में डेविस का उपयोग कर रहा है डेटटाइम को सम्मिलित करने की कोशिश करो। अब दिनांक / समय क्षेत्र में "डेटा प्रकार बेमेल" त्रुटि देता है जावास्क्रिप्ट के बिना एक HTML फार्म से एक सरणी पोस्ट करें "UpdateSourceTrigger = PropertyChanged" एक विंडोज फोन 7 पाठ बॉक्स के लिए बराबर है क्या बदलते घटना का प्रचार होता है? MySQL में WHERE खंड के साथ अनुक्रमणिका का उपयोग नहीं किया जा रहा है? एक config फाइल के बिना WCF कॉन्फ़िगरेशन कैसे बताओ जब UITableVIew ने पुनः लोडडेटा पूरा कर लिया है? HTML में पीडीएफ एम्बेड करने का अनुशंसित तरीका? जीआईटी रीसेट के बाद अस्थिर परिवर्तन छोड़े गए एक बयान के आसपास लेन-देन क्या करता है? समारोह से एकाधिक रिटर्न

वैश्विक ध्वज के साथ एक RegExp गलत परिणाम क्यों दे रहा है?

जब मैं वैश्विक ध्वज और मामला असंवेदनशील ध्वज का उपयोग करता हूँ तो इस नियमित अभिव्यक्ति में समस्या क्या है? क्वेरी एक उपयोगकर्ता उत्पन्न इनपुट है परिणाम [सच, सच] होना चाहिए

var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); result.push(re.test('Foo Bar')); // result will be [true, false] 

 var reg = /^a$/g; for(i = 0; i++ < 10;) console.log(reg.test("a")); 

वेब के समाधान से एकत्रित समाधान "वैश्विक ध्वज के साथ एक RegExp गलत परिणाम क्यों दे रहा है?"

RegExp ऑब्जेक्ट आखिरी सूचकांक का ट्रैक रखता है जहां एक मैच हुआ, इसलिए बाद के मैचों में यह 0 के स्थान पर, अंतिम उपयोग किए गए सूचकांक से शुरू हो जाएगा। एक नज़र डालें:

 var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); alert(re.lastIndex); result.push(re.test('Foo Bar')); 

यदि आप मैन्युअल रूप से हर परीक्षा के बाद 0 करने के लिए lastIndex रीसेट नहीं करना चाहते हैं, तो बस g फ़्लैग को हटा दें।

एल्गोरिथ्म यह है कि चश्मा निर्देश (खंड 15.10.6.2) है:

RegExp.prototype.exec (स्ट्रिंग)

नियमित अभिव्यक्ति के खिलाफ स्ट्रिंग के एक नियमित अभिव्यक्ति मैच को निष्पादित करता है और मैच के परिणाम युक्त एक एरे ऑब्जेक्ट देता है, या नल यदि स्ट्रिंग से मेल नहीं खाती है तो स्ट्रिंग टूस्ट्रिंग (स्ट्रिंग) को नियमित अभिव्यक्ति पैटर्न की घटना के लिए निम्न प्रकार से खोजा जाता है:

  1. चलो एस स्ट्रिंग (स्ट्रिंग) का मान हो।
  2. लम्बाई एस लंबाई की लंबाई दें
  3. अंतिम इंडेक्स को पिछले इंडैंड संपत्ति का मान दें
  4. मैं ToInteger (lastIndex) का मूल्य हो
  5. यदि वैश्विक संपत्ति झूठी है, तो मैं = 0
  6. यदि मैं <0 या I> लंबाई तब पिछली इंडेक्स को 0 पर सेट करें और रिक्त वापसी करें।
  7. कॉल [[मैच]], इसे तर्क S और i दे रहा है। यदि [[मैच]] विफलता लौटा, चरण 8 पर जाएं; अन्यथा, इसका राज्य का परिणाम हो और चरण 10 पर जाएं।
  8. चलो i = i + 1
  9. चरण 6 पर जाएं
  10. चलिए ई की आर एंड एंडएंडएक्स मान दें।
  11. यदि वैश्विक संपत्ति सच है, तो ई के लिए पिछले इंडेक्स सेट करें।
  12. आर की कैप्चर सरणी की लंबाई दें। (यह 15.10.2.1 के एनकॉप्टिंगिंग के समान मूल्य है।)
  13. निम्न गुणों के साथ एक नई सरणी लौटें:
    • इंडेक्स प्रॉपर्टी को पूर्ण स्ट्रिंग एस के भीतर मिलान किए गए सबस्ट्रिंग की स्थिति पर सेट किया गया है।
    • इनपुट गुण एस पर सेट है
    • लंबाई गुण n + 1 पर सेट है
    • 0 संपत्ति को मिलान किए गए सबस्ट्रिंग पर सेट किया गया है (अर्थात एस के हिस्से के बीच ऑफसेट मैं समावेशी और ऑफ़सेट ई अनन्य)।
    • प्रत्येक पूर्णांक के लिए मैं ऐसा है कि मैं> 0 और मैं ≤ n, टूथरींग (i) नामक संपत्ति को आर के कैप्चर सरणी के Iith तत्व में सेट करें।

आप एक एकल RegExp ऑब्जेक्ट का उपयोग कर रहे हैं और इसे कई बार निष्पादित कर रहे हैं प्रत्येक निष्पादन पर यह अंतिम मैच सूचकांक से जारी है।

आपको प्रत्येक निष्पादन से पहले शुरुआत से शुरू करने के लिए "रीसेट" करने की आवश्यकता है:

 result.push(re.test('Foo Bar')); re.lastIndex = 0; result.push(re.test('Foo Bar')); // result is now [true, true] 

यह कहा जा रहा है कि हर समय एक नया RegExp ऑब्जेक्ट बनाने के लिए और अधिक पठनीय हो सकता है (ओवरहेड कम है क्योंकि RegExp कैश्ड कैश है):

 result.push((/Foo B/gi).test(stringA)); result.push((/Foo B/gi).test(stringB)); 

RegExp.prototype.test नियमित अभिव्यक्ति ' RegExp.prototype.test अद्यतन करता है ताकि प्रत्येक परीक्षण शुरू हो जाएगा जहां पिछले एक बंद कर दिया मैं String.prototype.match का उपयोग करने का सुझाव देता String.prototype.match क्योंकि यह String.prototype.match संपत्ति को अपडेट नहीं करता है:

 !!'Foo Bar'.match(re); // -> true !!'Foo Bar'.match(re); // -> true 

नोट: !! इसे एक बूलियन में परिवर्तित कर देता है और फिर बूलीयन को बदल देता है, जिससे वह परिणाम को दर्शाता है।

वैकल्पिक रूप से, आप बस पिछले lastIndex संपत्ति को रीसेट कर सकते हैं:

 result.push(re.test('Foo Bar')); re.lastIndex = 0; result.push(re.test('Foo Bar')); 

ग्लोबल g फ़्लैग को हटाने से आपकी समस्या ठीक हो जाएगी।

 var re = new RegExp(query, 'gi'); 

होना चाहिए

 var re = new RegExp(query, 'i'); 

/ G ध्वज का उपयोग करने से यह हिट के बाद खोज जारी रखने के लिए कहता है।

यदि मैच सफल होता है, तो exec () पद्धति एक सरणी और नियमित अभिव्यक्ति ऑब्जेक्ट के गुणों को अपडेट करती है।

अपनी पहली खोज से पहले:

 myRegex.lastIndex //is 0 

पहली खोज के बाद

 myRegex.lastIndex //is 8 

जी निकालें और प्रत्येक कॉल को exec () के बाद खोज से बाहर निकलता है।