समस्या वैकल्पिक हल के लिए आप g
झंडा हटाने या lastIndex
var reg = /a/g;
console.log(reg.test("a"));
reg.lastIndex = 0;
console.log(reg.test("a"));
में के रूप में समस्या पैदा होती है क्योंकि test
exec
जो पहले के बाद अधिक मिलान ढूंढता के आसपास आधारित है, तो एक ही स्ट्रिंग पारित कर दिया और रीसेट कर सकते हैं g
ध्वज मौजूद है।
15.10.6.3RegExp.prototype.test(string)
# Ⓣ Ⓡ
निम्नलिखित कदम उठाए जाते हैं:
- मैचका उपयोग कर इस
RegExp
वस्तु पर RegExp.prototype.exec
(15.10.6.2) एल्गोरिथ्म के मूल्यांकन का परिणाम हो चलो तर्क के रूप में स्ट्रिंग।
- यदि मैच
null
नहीं है, तो true
लौटाएं; अन्य false
लौटें।
exec
का महत्वपूर्ण हिस्सा 15.10.6.2 के चरण 6 है:
6. बुला का नतीजा हो वैश्विक चलो [[] जाओ] तर्क "वैश्विक" के साथ आर के आंतरिक विधि।
7. यदि वैश्विक गलत है, तो मैं = 0.
0 पर रीसेट नहीं किया जाता i
करते हैं, तो exec
(और इसलिए test
) स्ट्रिंग की शुरुआत को देखकर शुरू नहीं करता है।
यह exec
के लिए उपयोगी है क्योंकि आप पाश प्रत्येक मैच को संभालने के लिए कर सकते हैं:
var myRegex = /o/g;
var myString = "fooo";
for (var match; match = myRegex.exec(myString);) {
alert(match + " at " + myRegex.lastIndex);
}
लेकिन स्पष्ट रूप से यह test
के लिए बहुत उपयोगी नहीं है।
स्रोत
2012-01-18 14:13:34
जिसका अर्थ है कि मुझे अंतिम इंडेक्स को 0 पर सेट करना चाहिए, है ना? – NStal
+1 अच्छा विवरण, मैं जानता था नहीं था। –
@NStal, हाँ, की स्थापना '0 को परीक्षण से पहले lastIndex' समस्या वैकल्पिक हल होगा। –