2012-01-25 12 views
14

निम्नलिखित उदाहरण पर विचार की उम्मीद:मैच() दो मैचों के साथ सरणी देता है जब मैं एक मैच

.jpg 
.jpg 
.jpg 
:

.jpg 
.jpg,.jpg 
.jpg 

मैं इस परिणाम की उम्मीद:

<html> 
<body> 

<script type="text/javascript"> 

var str="filename.jpg"; 

var pattOne = new RegExp('\.[^\.]*$'); 
var pattTwo = new RegExp('(\.[^\.]*$)'); 
var pattThree = new RegExp('(\.[^\.]*$)', 'g'); 

document.write(str.match(pattOne)); 
document.write('<br>'); 
document.write(str.match(pattTwo)); 
document.write('<br>'); 
document.write(str.match(pattThree)); 

</script> 
</body> 
</html> 

यहाँ नतीजा है

नियमित अभिव्यक्ति के आस-पास कोष्ठक रखने का नतीजा क्यों बदलता है? 'जी' संशोधक का उपयोग क्यों परिणाम फिर से बदलता है?

उत्तर

25

String.prototype.match[MDN] से:

नियमित अभिव्यक्ति g ध्वज शामिल नहीं है, regexp.exec(string) रूप में एक ही परिणाम देता है।

कहाँ RegExp.prototype.exec documentation [MDN] का कहना है:

लौटे सरणी प्रत्येक कब्जा कोष्ठक है कि पाठ कि कब्जा कर लिया था युक्त मिलान किया के लिए पहला आइटम के रूप में मिलान वाला पाठ, और फिर एक आइटम है।

इसलिए जब आप दूसरी अभिव्यक्ति में एक कैप्चर समूह पेश करते हैं, तो पहला तत्व संपूर्ण मैच होता है और दूसरे में कैप्चर समूह की सामग्री होती है, जो आपके उदाहरण में, संपूर्ण मिलान भी है।
पहली अभिव्यक्ति में कैप्चर समूह नहीं है, इसलिए आप केवल मैच वापस ले लेंगे।

match प्रलेखन पर वापस

नियमित अभिव्यक्ति g ध्वज शामिल है, तो विधि सभी मैचों युक्त एक सरणी देता है। यदि कोई मिलान नहीं था, तो विधि null लौटाती है।

g संशोधक के साथ, केवल मिलान लौटाए जाते हैं, लेकिन कैप्चर समूहों की सामग्री नहीं। आपकी स्ट्रिंग में केवल एक मैच है।

8

.match() फ़ंक्शन एक सरणी देता है। document.write() सरणी को एक स्ट्रिंग के रूप में मुद्रित किया गया।

जब आप स्ट्रिंग में एक समूह पर कब्जा कर लिया यह बनाता है इस तरह की एक सरणी:

Array(
    [0] => 'the complete matched string', 
    [1] => 'the first captured group', 
    [2] => 'the second captured group', 
    [.] => '...' 
) 

तो अपने regex के साथ यह हो जाता है:

Array(
    [0] => '.jpg', // You match .jpg of the string 
    [1] => '.jpg' // You captured the .jpg match 
) 

और अगर आप एक सरणी प्रिंट यह एक , स्थानों मूल्यों के बीच।

+0

उत्तर सही है, स्पष्टता के लिए: समूह मिलान को कैप्चर करना अतिरिक्त कोष्ठक के कारण होता है। यह तब उपयोगी होता है जब आप कुछ सबमिशन पर काम करना पसंद करते हैं। उदाहरण के लिए यह संभव होगा: 'var pattOne = new RegExp (' \। ([^ \।] *) $ ');' समूह के मुकाबले केवल फाइल-एक्सटेंशन के बिना बिंदु है। – zaphod1984

+4

मैं वहां से कुछ PHP पोकिंग देखता हूं – qwertymk

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