2011-01-14 7 views
5

आज मैं एक बहुत ही अजीब जावास्क्रिप्ट नियमित अभिव्यक्ति मुद्दे पर आया था। वैश्विक संशोधक (// g) का उपयोग करते समय, RegExp.test() बाद की कॉल में अलग-अलग मान उत्पन्न करता है। क्या कोई समझा सकता है क्यों?जावास्क्रिप्ट के RegExp कॉल के बीच स्थिति क्यों बनाए रखता है?

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 
console.log(re1.test(s)); // false 
console.log(re1.test(s)); // true 

var re2 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/; 

console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 
console.log(re2.test(s)); // true 

मैं क्रोम 8 और फ़ायरफ़ॉक्स 3.6 में इसे पुन: उत्पन्न करने में सक्षम हूं।

उत्तर

7

यह केवल तभी होता है जब आप g ध्वज का उपयोग करते हैं। मैं मानता हूं कि यह सबसे अच्छा डिज़ाइन नहीं है, लेकिन बिंदु आपको मैचों पर लूप देना है, उदा। re1.exec के साथ।

var s = "fo1,fo2,fo3,"; 
var re1 = /fo\d,/g; 
var match; 
while(match = re1.exec(s)) 
{ 
    alert(match); 
} 
2

जी "झंडा" आपका रेगुलर एक्सप्रेशन का उपयोग करता है ", आप कार्यकारी विधि कई बार एक ही स्ट्रिंग में मैचों को खोजने के लिए उपयोग कर सकते हैं। जब आप ऐसा करते हैं, खोज की सबस्ट्रिंग पर शुरू होता है एस नियमित अभिव्यक्ति की अंतिम इंडेक्स संपत्ति द्वारा निर्दिष्ट (परीक्षण अंतिम इंडेक्स संपत्ति को भी अग्रिम करेगा)। "

"निष्पादन के साथ (या इसके साथ संयोजन में), उसी वैश्विक नियमित अभिव्यक्ति उदाहरण पर कई बार परीक्षण किया गया परीक्षण पिछले मैच से पहले आगे बढ़ेगा।"

var s = "youtube.com/watch?v=XyeebVA3DNk"; 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 

var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g; 

console.log(re1.test(s)); // true 
संबंधित मुद्दे