2012-03-20 22 views
9

में जावास्क्रिप्ट, रेगेक्स पार्स स्ट्रिंग सामग्री मैं regex के लिए नया हूँ। मैं स्ट्रिंग में घुंघराले ब्रैकेट के अंदर सभी सामग्री को पार्स करने की कोशिश कर रहा हूं। मैंने this post को एक संदर्भ के रूप में देखा और वास्तव में उत्तरों में से एक सुझाव दिया, हालांकि परिणाम अप्रत्याशित है।घुड़सवार ब्रैकेट

यहाँ मैं

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/ 
regex.exec(abc) // i got ["{string1}", "string1"] 
      //where i am expecting ["string1", "string2"] 

क्या किया मुझे लगता है कि मैं कुछ याद आ रही है, क्या मैं गलत कर रहा हूँ है?

अद्यतन

मैं एक वैश्विक खोज

var regex = /{(.*?)}/g 
abc.match(regex) //gives ["{string1}", "{string2}"] 

के लिए /g साथ इसे पाने के लिए कर रहा था मैं कैसे w/ओ कोष्ठक स्ट्रिंग मिल सकता है?

उत्तर

17
"test/abcd{string1}test{string2}test".match(/[^{}]+(?=\})/g) 

पैदा करता

["string1", "string2"] 

यह मानता है कि हर } एक { इसी इससे पहले कि यह और {...} वर्गों घोंसला नहीं है। यह खाली {} अनुभागों की सामग्री को भी कैप्चर नहीं करेगा।

+0

महान, बस मैं चाहता था कि –

+3

यह अच्छा है। लेकिन आपको बंद ब्रेस से बचने की जरूरत नहीं है। '/ [^ {}] (? =})/G' – Kash

0

इस परिणाम:

["{string1}", "string1"] 

आप दिखा रहा है कि पहले मैच के लिए, पूरे regex "{string1}" मेल खाते हैं और पहले कैप्चरिंग कोष्ठकों का मिलान नहीं हुआ "string1"

आप सभी मैचों हो और प्रत्येक मैच के सभी पर कब्जा करने कोष्ठक देखना चाहते हैं, तो आप, के माध्यम से "जी" झंडा और पाश का उपयोग बुला इस तरह exec() कई बार कर सकते हैं:

var abc = "test/abcd{string1}test{string2}test"; //any string 
var regex = /{(.+?)}/g; 
var match, results = []; 
while (match = regex.exec(abc)) { 
    results.push(match[1]); // save first captured parens sub-match into results array 
} 

// results == ["string1", "string2"] 

आप इसे देख सकते हैं यहाँ काम: http://jsfiddle.net/jfriend00/sapfm/

+0

एक शर्त में असाइनमेंट ... चाय का मेरा कप नहीं। – jbabey

+0

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

+0

धन्यवाद, मैं सोच रहा था कि एक ही स्ट्रिंग दो बार क्यों दिखाई दी। धन्यवाद! –

1

इस प्रयास करें:

var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g //g flag so the regex is global 
abc.match(regex) //find every match 

एक अच्छी जगह जावास्क्रिप्ट में Regex के बारे में पढ़ने के लिए here, और एक अच्छा प्लेसमेंट को है ई परीक्षण करने के लिए here

शुभकामनाएँ!

+0

मुझे नहीं लगता कि जी यहां एक अंतर डालेगा। यह दूसरा मैच नहीं है (स्ट्रिंग 2) क्योंकि यह केवल एक बार निष्पादन को कॉल कर रहा है। – Kash

+0

@ कश आप सही हैं, लेकिन मैंने मैच कहा, और जी के बिना, यह '["{string1}", "string1"]' – NicoSantangelo

+0

महान regex सीखने संसाधन वापस करेगा, आपको बहुत धन्यवाद –

0

कुछ भी गलत नहीं है। लेकिन आपको इच्छित सामग्री प्राप्त करने के लिए आपको अपने कैप्चरिंग समूह (सरणी में दूसरा तत्व) देखना होगा (आप पहले अनदेखा कर सकते हैं)। सभी अवसरों को प्राप्त करने के लिए, exec चलाने के लिए पर्याप्त नहीं है, आपको match का उपयोग करके परिणामों पर लूप करना होगा।

संपादित करें: कभी भी यह नहीं बताएं कि आप match के साथ कैप्चरिंग समूहों तक नहीं पहुंच सकते हैं। माइक सैमुअल suggested के रूप में एक आसान समाधान सकारात्मक दिखने का उपयोग करेगा।

1
var abc = "test/abcd{string1}test{string2}test" //any string 
var regex = /{(.+?)}/g 
var matches; 

while(matches = regex.exec(abc)) 
    console.log(matches);