2010-08-15 4 views
36

मुझे जावास्क्रिप्ट में बहुत सारी चीजें करने की ज़रूरत है लेकिन मुझे वाक्यविन्यास के साथ कुछ समस्याएं हैं और मुझे इस पर एक निश्चित संसाधन नहीं मिल रहा है .. कुछ के लिए कारण जब मैं कार्य करें:प्रतिकृति निकालने के लिए रेगेक्स, किसी कारण के लिए 2 परिणाम लौटा रहे हैं

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test) 

यह पता चलता है

"afskfsd33j, fskfsd33" 

मैं क्यों अपने मूल के इस उत्पादन और मिलान किया स्ट्रिंग दे रही है यकीन है कि, मैं सोच रहा हूँ कि कैसे मैं यह सिर्फ देने के लिए प्राप्त कर सकते हैं नहीं कर रहा हूँ मैच (अनिवार्य रूप से उस भाग को निकालना जो मैं मूल स्ट्रिंग से चाहता हूं)

किसी भी सलाह के लिए धन्यवाद

+3

ध्यान दें कि आपके पास मूल और मिलान की गई स्ट्रिंग नहीं है जैसा कि आप बताते हैं। आपके पास मिलान की गई स्ट्रिंग "afskfsd33j" है। फिर दूसरी वस्तु "fskfsd33" आपके regexp में कोष्ठक से आ रही है: (। *) – Mic

उत्तर

73

match एक सरणी देता है।

जावास्क्रिप्ट में किसी सरणी का डिफ़ॉल्ट स्ट्रिंग प्रस्तुति अल्पविराम से अलग सरणी के तत्व है। इस मामले में वांछित परिणाम सरणी का दूसरा तत्व में है:

var tesst = "afskfsd33j" 
var test = tesst.match(/a(.*)j/); 
alert (test[1]); 
+1

ओह ठीक है, मुझे लगता है कि मुझे याद आया .. धन्यवाद, मैं कभी-कभी जावास्क्रिप्ट से भ्रमित हो जाता हूं क्योंकि मुझे प्रिंटिंग के अधिक प्रतिबंधित तरीके से उपयोग किया जाता है PHP – Rick

+1

में सरणी शायद मुझे गूंगा लगता है, लेकिन मैच मूल स्ट्रिंग क्यों देता है? क्या इस पर कोई दस्तावेज है? –

+4

@ जॉन-ली ऐसा इसलिए है क्योंकि मूल स्ट्रिंग regex '/ a (। *) J /' से मेल खाती है और सरणी की दूसरी प्रविष्टि में पहला मिलान समूह '(। *) 'होता है। इसके अलावा समूह (0) हमेशा पूरा मैच होता है जबकि समूह (एन) ब्रैकेट द्वारा चिह्नित एन-वें समूह होता है। मुझे उम्मीद है कि यह समझ में आता है [अधिक जानकारी के लिए यह दस्तावेज़ीकरण] [https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/match) –

4

मुझे लगता है कि तुम्हारी समस्या है कि मैच विधि एक सरणी लौट रहा है। सरणी में 0 वें आइटम मूल स्ट्रिंग है, पहली बार nth आइटम्स पहले से मिलान किए गए ब्रांडेड किए गए आइटम से मेल खाता है। आपका "अलर्ट()" कॉल संपूर्ण सरणी दिखा रहा है।

+4

मैं यह नहीं बता सकता कि क्या यह गलत है या बस बुरी तरह से शब्द है। सरणी में पहला तत्व ('परीक्षण [0] ') पूरी स्ट्रिंग नहीं है, यह स्ट्रिंग का हिस्सा है जो पूरे रेगेक्स से मेल खाता था। इस मामले में वे वही होते हैं, लेकिन यदि रेगेक्स '/ f (। *) J /' रहा होता है, तो परिणाम 'fskfsd33j, skfsd33' होता है (प्रारंभिक' ए 'मैच में शामिल नहीं होता है) । –

3

मुझे अभी भी एक ही समस्या है।

यदि आप एक मैच समूह (ब्रैकेट्स) और 'जी' (ग्लोबल) संशोधक को शामिल करते हैं तो आपको केवल अपने परिणाम में टेक्स्ट दो बार मिलता है।

while ((result = reg.exec(string)) !== null){ 
    console.log(result); 
} 

परिणाम कुछ भिन्न होते हैं: पहला आइटम हमेशा पहला परिणाम, सामान्य रूप से ठीक हैं जब मैच (reg) का उपयोग कर एक छोटी स्ट्रिंग पर, फिर भी जैसे एक निर्माण का उपयोग करते समय है। -

सर्वश्रेष्ठ उत्तर वर्तमान में एक टिप्पणी जो मैं वोट दें नहीं कर सकता है, इसलिए क्रेडिट @ करने के लिए

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
var result = sample_string.match(regEx); 
console.log(JSON.stringify(result)); 
// ["1 cat","2 fish"] 

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null) { 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","cat"]' 
// '["2 fish","fish"]' 

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish"; 
while ((result = reg.exec(sampleString)) !== null){ 
    console.dir(JSON.stringify(result)) 
}; 
// '["1 cat","1 cat","cat"]' 
// '["2 fish","2 fish","fish"]' 

(क्रोम, Node.js हाल वी 8 पर परीक्षण):

निम्नलिखित कोड का प्रयास करें माइक।

2

संश्लेषण() द्वारा परिभाषित प्रत्येक समूह को प्रोसेसिंग के दौरान पकड़ा जाता है और प्रत्येक कैप्चर किए गए समूह की सामग्री को परिणाम क्रम में परिणाम के रूप में उसी क्रम में धक्का दिया जाता है क्योंकि पैटर्न शुरू होता है।

सरणी में सबसे पहले मूल्य पहले पाया स्ट्रिंग जो पूरे पुष्टि करता है: http://www.regular-expressions.info/brackets.html और http://www.regular-expressions.info/refcapture.html पर अधिक देखें

var source = "afskfsd33j" 
var result = source.match(/a(.*)j/); 

result: ["afskfsd33j", "fskfsd33"] 

कारण है कि आप बिल्कुल इसी परिणाम प्राप्त पीछा कर रहा है (समर्थित सुविधाओं को देखने के लिए सही भाषा का चयन) पैटर्न। इसलिए इसे "ए" शुरू करने के बाद पहले "जे" चार के साथ किसी भी अक्षर और सिरों के बाद निश्चित रूप से "ए" से शुरू होना चाहिए।

सरणी में दूसरा मान कोष्ठक द्वारा परिभाषित समूह पर कब्जा कर लिया गया है। आपके मामले में समूह में पूरे पैटर्न मिलान होते हैं जो बिना किसी सामग्री के परिभाषित किए गए सामग्री के होते हैं, इसलिए बिल्कुल "fskfsd33"।

यदि आप चाहते हैं सरणी में दूसरा मान से छुटकारा पाने के आप इस तरह के पैटर्न को परिभाषित कर सकते हैं:

/a(?:.*)j/ 

जहां ":" इसका मतलब है कि वर्ण कौन-से मिलान कोष्टक में सामग्री का हिस्सा नहीं होगा के समूह परिणामी सरणी

अन्य विकल्प इस सरल मामले में हो सकता है, क्योंकि यह आवश्यक सब पर समूह का उपयोग नहीं है किसी भी समूह के बिना पैटर्न लिखने के लिए:

/a.*j/ 

तुम सिर्फ स्रोत पाठ नमूने का मिलान और करता है कि क्या जाँच करना चाहते हैं परवाह नहीं जो पाठ के बारे में यह पाया की तुलना में आप कोशिश कर सकते हैं:

var result = /a.*j/.test(source); 

परिणाम तो ही सच्चा लौटना चाहिए | झूठी मान। अधिक जानकारी के लिए http://www.javascriptkit.com/javatutors/re3.shtml

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