2012-11-19 24 views
6

मैं एक regexp जो शब्दों का एक अल्पविराम पृथक सूची से मेल खाते हैं और सभी शब्दों पर कब्जा होगा लिखने की कोशिश कर रहा हूँ। इस लाइन मिलान किया जाना चाहिए    apple , banana ,orange,peanut  और कैप्चर apple, banana, orange, peanut होना चाहिए। regexp निम्नलिखित है कि मैं का उपयोग करने के लिए:अजीब regexp व्यवहार - केवल पहले से मेल खाता है और पिछले कैप्चर समूह

^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$ 

यह सफलतापूर्वक स्ट्रिंग से मेल खाता है, लेकिन अचानक ही apple और peanut पर कब्जा कर लिया गया है। यह व्यवहार सी # और पर्ल दोनों में देखा जाता है। इस प्रकार मुझे लगता है कि मैं regexp मिलान कैसे काम करता है के बारे में कुछ याद कर रहा हूँ। कोई विचार? :)

उत्तर

3

match.Groups[2].Value द्वारा दिए गए मूल्य केवल पिछले मूल्य दूसरे समूह द्वारा कब्जा कर लिया है।

सभी मूल्यों को खोजने के लिए, 0 से 2 करने के लिए i पर्वतमाला इस मामले में match.Groups[2].Captures[i].Value जहां देखो। (। साथ ही पहले समूह के लिए match.Groups[1].Value के रूप में)

(! +1 प्रश्न के लिए, मैं आज कुछ सीखा)

+0

+1 मुझे यकीन है कि अगर .net इस सुविधा है नहीं था और जांच करने के लिए बहुत आलसी था। – stema

+0

@stema मुझे यह भी एहसास नहीं हुआ कि यह एक मुद्दा था, मैंने सोचा कि सभी मूल्य 'समूह' में बदल जाएंगे! – Rawling

+0

मुझे 'कैप्चर' संग्रह पर इंगित करने के लिए धन्यवाद! आखिरकार मैं एक ही regexp का उपयोग करने के साथ आया क्योंकि मैंने सवाल में रखा था और फिर मैं 'int (= i = 1; i bazzilic

2

आप repeating your capturing group हैं, हर बार-बार मैच में पिछली सामग्री ओवरराइट है। तो अंत में आपके दूसरे कैप्चरिंग समूह का अंतिम मैच उपलब्ध है।

आप अपने दूसरे समूह में ", केला, नारंगी, मूंगफली"

^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$ 

अपने दूसरे कैप्चरिंग समूह बदलने फिर परिणाम होगा सकते हैं। मुझे यकीन नहीं है, अगर आप इसे चाहते हैं।

आप स्ट्रिंग है जो पैटर्न है कि जाँच और प्रत्येक शब्द को निकालने के लिए चाहते हैं। मैं इसे दो चरणों में करूँगा।

  1. अपने रेगेक्स के साथ पैटर्न की जांच करें।

  2. यदि पैटर्न सही है, तो अग्रणी और पिछला सफेद स्थान हटाएं और \s*,\s* पर विभाजित करें।

3

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

string text = " apple , banana ,orange,peanut"; 

var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?") 
     .Cast<Match>() 
     .Select(x => x.Groups["word"].Value) 
     .ToList(); 
+2

पीएस: यह नियमित अभिव्यक्तियों का परीक्षण करने के लिए एक अच्छी साइट है .NET: [रेगेक्स हीरो] (http://regexhero.net/tester/) –

+0

मैंने [यह एक] उपयोग किया (http://regexpal.com/) – bazzilic

+1

मुझे यह पसंद है [http://regexstorm.net/tester?p= ([AZ] {2}) ([0-3]) (0 [1-9] | [12] \ घ | 3 [01]) (0 [1-9] | 1 [0-2]) (\ घ {2}) (\ घ {3}) और मैं = KT2140210456)। –

2

सरल regexp:

(?:^| *)(.+?)(?:,|$)

स्पष्टीकरण:

?: # Non capturing group 
^| * # Match start of line or multiple spaces 
.+ # Capture the word in the list, lazy 
?: # Non capture group 
,|$ # Match comma or end of line 

नोट: Rublular बात इस तरह का परीक्षण करने के लिए एक अच्छा वेबसाइट है।