2015-05-26 6 views
6

मैं इस स्ट्रिंग (बहु लाइन सिंटेक्स नोटिस) है:यह रेगेक्स मिलान गैर-कैप्चरिंग समूह के भीतर भी क्यों है?

var str = ` Number One: Get this 
    Number Two: And this`; 

और मैं एक regex कि (match के साथ) रिटर्न चाहते हैं:

[str, 'Get this', 'And this'] 

तो मैं str.match(/Number (?:One|Two): (.*)/g); की कोशिश की, लेकिन यह लौट रहा है:

["Number One: Get this", "Number Two: And this"] 

किसी भी "Number" शब्द से पहले कोई सफेद स्थान/रेखा-ब्रेक हो सकता है।

कैप्चरिंग समूह के अंदर केवल यही क्यों नहीं लौटाता है? क्या मैं कुछ गलत कर रहा हूँ? और मैं वांछित परिणाम कैसे प्राप्त कर सकता हूं?

उत्तर

4

प्रति the MDN documentation for String.match:

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

(जोर मेरा)।

तो, आप जो चाहते हैं वह संभव नहीं है।

एक ही पृष्ठ जोड़ता है:

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

इसलिए यदि आप match के प्रयोग पर देने के लिए तैयार कर रहे हैं, आप अपने खुद के समारोह है कि बार-बार regex लागू होता है, पर कब्जा कर लिया सबस्ट्रिंग हो जाता है, और एक सरणी बनाता है लिख सकते हैं।


या, अपने विशिष्ट मामले के लिए, आप कुछ इस तरह लिख सकते हैं:

var these = str.split(/(?:^|\n)\s*Number (?:One|Two): /); 
these[0] = str; 
+0

ठीक है, धन्यवाद। क्या आप जानते हैं कि यह सभी रेगेक्स इंजनों के साथ समान है? मेरा मतलब है, अगर यह सामान्य रूप से regex कैसे काम करता है के कारण है। – Jacob

+0

मुझे लगता है कि मैं यह कर रहा हूं (बेशक, 'arr' घोषित करना): 'str.split (' \ n ')। प्रत्येक के लिए (x => arr.push (x.match (/ संख्या (?: एक | दो): (। *) /) [1])); ', आपको क्या लगता है? – Jacob

+0

आह, अद्यतन को नहीं देखा, जो भी काम करता है। और @ guest271314 का समाधान भी काम करता है, लेकिन आपने समझाया कि ऐसा क्यों नहीं हुआ, और यह अच्छा है। धन्यवाद। मुझे पूरी स्ट्रिंग में वास्तव में दिलचस्पी नहीं है, मैंने अभी इस सवाल में लिखा है क्योंकि इस तरह मैंने सोचा कि मिलान हमेशा समूहों को पकड़ने के साथ काम करता है। – Jacob

2

var str = " Number One: Get this\ 
 
    Number Two: And this"; 
 
    // `/\w+\s+\w+(?=\s|$)/g` match one or more alphanumeric characters , 
 
    // followed by one or more space characters , 
 
    // followed by one or more alphanumeric characters , 
 
    // if following space or end of input , set `g` flag 
 
    // return `res` array `["Get this", "And this"]` 
 
    var res = str.match(/\w+\s+\w+(?=\s|$)/g); 
 

 
    document.write(JSON.stringify(res));

+1

धन्यवाद। यह भी अच्छा है, और तीर कार्यों के साथ भी अच्छा है !: 'var res = str.match (/: \ s + \ w + \ s + \ w +/g) .map (v => v.replace (": "," ")); – Jacob

2

बदलें प्रयास करें और एक नया में परिणाम की दुकान स्ट्रिंग, इस तरह:

var str = ` Number One: Get this 
Number Two: And this`; 
var output = str.replace(/Number (?:One|Two): (.*)/g, "$1"); 
console.log(output); 

आउटपुट जो:

Get this 
And this 

आप मैच सरणी की तरह आप का अनुरोध किया चाहते हैं, तो आप इस कोशिश कर सकते हैं:

var getMatch = function(string, split, regex) { 
    var match = string.replace(regex, "$1" + split); 
    match = match.split(split); 
    match = match.reverse(); 
    match.push(string); 
    match = match.reverse(); 
    match.pop(); 
    return match; 
} 

var str = ` Number One: Get this 
Number Two: And this`; 
var regex = /Number (?:One|Two): (.*)/g; 
var match = getMatch(str, "#!SPLIT!#", regex); 
console.log(match); 

जो सरणी के रूप में वांछित प्रदर्शित करता है:

[ ' Number One: Get this\n Number Two: And this', 
' Get this', 
'\n And this' ] 

जहां विभाजित (यहां #!SPLIT!#) एम को विभाजित करने के लिए एक अद्वितीय स्ट्रिंग होना चाहिए atches। ध्यान दें कि यह केवल एकल समूहों के लिए काम करता है। बहु समूहों के लिए समूहों की संख्या को इंगित करने वाला एक चर जोड़ें और "$1 $2 $3 $4 ..." + split का निर्माण करने के लिए एक लूप जोड़ें।

+0

धन्यवाद! पूरी स्ट्रिंग मेरे लिए इतना महत्वपूर्ण नहीं है, मैंने जिस तरह से मैच काम किया है, उसके कारण मैंने इसे इंगित किया है। आपके पहले उदाहरण में, कोई भी यह कर सकता है: 'output.trim()। Split (' \ n ');' सरणी प्राप्त करने के लिए, मुझे लगता है। – Jacob

+1

हां यह इस मामले में भी काम करेगा लेकिन मुझे लगता है कि अगर मैच के बिना कोई लाइन हो तो यह असफल हो जाएगी। – ShellFish

+0

आह हाँ, आप सही हैं, इसमें सरणी में गैर-मिलान भी शामिल होंगे। – Jacob

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