2011-06-01 20 views
31

मुझे यह काम करने में मुश्किल हो रही है। मैं इस तरह की स्ट्रिंग है:RegEx कोष्ठक के बीच सामान मिलान करने के लिए

something/([0-9])/([a-z]) 

और मैं regex या कोष्ठकों के बीच प्रत्येक मैच के लिए हो रही करने की एक विधि की जरूरत है और इस तरह के मैचों की एक सरणी वापसी:

[ 
    [0-9], 
    [a-z] 
] 

regex मैं उपयोग कर रहा हूँ /\((.+)\)/ है जो सही चीज़ से मेल खाता प्रतीत होता है यदि केवल एक ब्रांड्स का सेट है।

जावास्क्रिप्ट में किसी भी RegExp विधि का उपयोग करके मैं ऊपर की तरह सरणी कैसे प्राप्त कर सकता हूं? मुझे केवल उस सरणी को वापस करने की आवश्यकता है क्योंकि सरणी में आइटम लौटाएगा, एक यूआरएल रूटिंग योजना बनाने के लिए looped किया जाएगा।

+1

आप जब कहते हैं कि "कोष्ठकों का एक सेट", कर रहे हैं आप * नेस्टेड * कोष्ठक का जिक्र करते हैं? यह मूल रूप से पूरे "संतुलित कोष्ठक" चीज़ को समझने के लिए नियमित अभिव्यक्तियों की शक्ति से परे है। – Pointy

+0

_Anything_ '()' के अंदर। तो अगर स्ट्रिंग 'कुछ/([0-9])/((ए) (बी))' '[[0-9], (ए) (बी)]' 'वापस आ जाएगी। मैं इन्हें मान्य करने वाला नहीं हूं, बस एक 'नया RegExp() ' –

उत्तर

71

आपको 'रे' जोड़कर अपना रेगेक्स पैटर्न 'गैर-लालची' बनाना होगा '+'

डिफ़ॉल्ट रूप से, '*' और '+' लालची हैं, वे स्ट्रिंग के भीतर होने वाले किसी भी मैचों को अनदेखा करते हुए, जितनी संभव हो सके तारों की एक स्ट्रिंग से मेल खाते हैं।

गैर-लालची पैटर्न केवल सबसे कम संभव मैच से मेल खाता है।

बेहतर स्पष्टीकरण के लिए Watch Out for The Greediness! देखें।

या वैकल्पिक रूप से,

\(([^\)]+)\) 

करने के लिए अपने regex बदलने जो कोष्ठक कि नहीं, खुद को, कोष्ठक शामिल नहीं के किसी भी समूह से मेल खाएगी।

+0

पर सही फेंक रहा हूं, जो इससे मेल खाता है! लेकिन मैं उस से एक सरणी बनाने के लिए अटक गया हूँ? मुझे बस '["([0-9])"] '' str.match (/ \ ([^ \)] + \)/g) के साथ मिलता है' ':( –

+2

आप आंतरिक प्रारंभ और अंत कैप्चर गायब हैं माता-पिता। कोशिश करें/\\ (([^]] +) \\)/g जो सभी संभावित संश्लेषित मानों को कैप्चर करेगा। \\ (और पहले \\) के बाद * दूसरी * माता-पिता की जोड़ी नोट करें। –

+0

बिल्कुल सही धन्यवाद! –

4

इस अभिव्यक्ति का उपयोग करें:

/\(([^()]+)\)/g 

जैसे:

function() 
{ 
    var mts = "something/([0-9])/([a-z])".match(/\(([^()]+)\)/g); 
    alert(mts[0]); 
    alert(mts[1]); 
} 
3
var getMatchingGroups = function(s) { 
    var r=/\((.*?)\)/g, a=[], m; 
    while (m = r.exec(s)) { 
    a.push(m[1]); 
    } 
    return a; 
}; 

getMatchingGroups("something/([0-9])/([a-z])"); // => ["[0-9]", "[a-z]"] 
2

अपने स्ट्रिंग है:

s.replace(/^[^(]*\(/, "") // trim everything before first parenthesis 
.replace(/\)[^(]*$/, "") // trim everything after last parenthesis 
.split(/\)[^(]*\(/);  // split between parenthesis 
संबंधित मुद्दे