2011-11-23 8 views
6

यदि मैं यह चलाएँ:जावास्क्रिप्ट में प्रत्येक मैच को खोजने के लिए मुझे रेगेक्स कैसे मिल सकता है?

'121'.match(/[0-9]{2}/gi) 

मैं वापस एक ही परिणाम के साथ एक सरणी मिल:

['12'] 

मैं कैसे भले ही वे ओवरलैप यह सब परिणाम देने के प्राप्त कर सकते हैं?

['12', '21'] 

संपादित करें:: या एक बेहतर उदाहरण होगा: मैं परिणाम यह होना चाहता हूँ

'1234567'.match(...); 

मुझे

[12 के साथ एक सरणी, 23, 34 देना चाहिए, 45, 56, 67]

+0

प्रश्न क्या है? –

+1

मैं उस स्ट्रिंग से '12' और '21' दोनों प्राप्त करने की कोशिश कर रहा हूं - इसके बजाय मुझे बस '12' मिलता है क्योंकि रेगेक्स इंजन एक मैच खोजने के बाद बंद हो जाता है। – Nick

उत्तर

4

यह आपके इच्छित तरीके से काम नहीं करेगा।

जब आप पैटर्न [0-9]{2} निर्दिष्ट करते हैं, match() दो अंकों की संख्या की पहली घटना को देखता है, तो उस स्थान से खोज जारी रखता है। क्योंकि स्ट्रिंग लम्बाई 3 है, जाहिर है कि इसे एक और मैच नहीं मिलेगा।

आपको सभी दो अंकों की संख्या खोजने के लिए अलग-अलग एल्गोरिदम का उपयोग करना चाहिए। मैं आपके पहले मैच के संयोजन का उपयोग करने का सुझाव दूंगा और निम्नलिखित रेगेक्स

/[0-9]([0-9]{2})/ और पहले और दूसरे रन दोनों के सेट को जोड़कर एक और कार्य करेगा।

1

यह बहुत संक्षिप्त नहीं है, लेकिन यह:

var matches = []; 
'1234567'.replace 
(
    /(?=[0-9]{2})/gi, 
    function(s,pos,str) 
    { 
    matches.push(str.substr(pos, 2)); 
    } 
); 

['12','23','34','45','56','67'] करने के लिए matches सेट हो जाएगा। यह वास्तव में उन्हें निगलने के बिना मैच खोजने के लिए एक लुकहेड दावे का उपयोग करके काम करता है। (replace वास्तव में इस मामले में कुछ भी की जगह नहीं है, यह सिर्फ एक दिया स्ट्रिंग में एक regex मैचों की सभी आवृत्तियों के लिए एक बंद को लागू करने के लिए एक सुविधाजनक तरीका है।)

3

आप इस तरह यह कर सकते हैं:

var str = '121'; 
var results = []; 
var re = /[0-9]{2}/gi, matches; 
while (matches = re.exec(str)) { 
    results.push(matches[0]); 
    re.lastIndex -= (matches[0].length - 1); // one past where it matched before 
} 
// results is an array of matches here 

.exec() पर कई कॉल लेते हैं और फिर आपको .lastIndex मान में हेरफेर करना होगा ताकि यह शुरू हो जाए जहां आप इसे फिर से देखना चाहते हैं।

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

आप कैसे पढ़ सकते हैं .exec() कई बार यहां काम करता है: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec

1

यहाँ lookaheads

ruakh रूप
var str = "12345", 
    regexp = /\d(?=(\d))/g, 
    results = [], 
    m = null; 

while(m = regexp.exec(str)) results.push(m.join('')); 

alert(results) // 12,23,34,45 

एक ही विचार है, लेकिन एक अलग दृष्टिकोण का उपयोग कर एक और उदाहरण है।

6

यह अधिकांश पिक इंजनों के साथ काम करता है।
कैप्चर 2, 1 का उपभोग करें।

/(?=(\d\d))\d/g

मैं जावास्क्रिप्ट के लिए नया हूँ। यह काम करता है:

var pat = /(?=(\d\d))\d/g; 
var results = []; 
var match; 

while ((match = pat.exec('1234567')) != null) { 
    results.push(match[1]); 
} 

print (results); 

आउटपुट: 12,23,34,45,56,67

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