2009-12-01 6 views
5

के साथ पहला मैच कैप्चर करना यह सी # के साथ मेरा पहला अनुभव है और नियमित अभिव्यक्तियों के साथ मेरे सीमित अनुभव का हिस्सा है और मुझे किसी विशेष अभिव्यक्ति में किसी मिलान की पहली घटना को कैप्चर करने में समस्या हो रही है। मेरा मानना ​​है कि निम्नलिखित उदाहरण शब्दों के मुकाबले इसे और स्पष्ट कर देगा जो मैं करना चाहता हूं।रेगेक्स (सी #)

Match extractor = (new Regex(@".*\d(?<name>.*)\d.*")).Match("This hopefully will pick up 1Bob9error1 as a name"); 
     Console.WriteLine(extractor.Groups["name"]); 

मैं इस अभिव्यक्ति को "त्रुटि" के बजाय "बॉब" प्रिंट करना चाहता हूं।

मेरे पास एक झुकाव है जिसके साथ इसका कुछ संबंध है? मिलान करने वाले समूह के सामने, लेकिन मुझे बिल्कुल यकीन नहीं है कि ऑपरेशन क्या है? इस विशेष मामले में प्रदर्शन करता है। कुछ मदद के साथ एक स्पष्टीकरण अद्भुत होगा।

धन्यवाद दोस्तों, आपको नहीं पता कि यह साइट मेरे जैसे शुरुआती प्रोग्रामर की कितनी मदद करती है।

+0

(? yourRegEx) का अर्थ है एक कब्जा समूह जिसका नाम "नाम" हो सकता है। यही कारण है कि आप extractor का उपयोग करने में सक्षम हैं। समूह ["नाम"] – nickytonline

उत्तर

7

आपकी समस्या लालच है। रेगेक्स लोभ जो है। आपका। * शुरुआत में यह सब पकड़ लेता है "यह उम्मीद है कि 1 बॉब उठाएगा"। इसके बजाय इस रेगेक्स को आजमाएं:

\d(?<name>[^\d]+)\d 
+0

चाड, मैं आपको RegExWorkbench इंस्टॉल करने की सलाह दूंगा, http://code.msdn.microsoft.com/RegexWorkbench। यह एक पुरानी परियोजना है लेकिन एरिक गुनरसन द्वारा बनाई गई है। यदि आपके पास .NET 1.x फ्रेमवर्क स्थापित नहीं है, तो वह स्रोत प्रदान करता है ताकि आप इसे स्थापित ढांचे का उपयोग करके संकलित कर सकें। – nickytonline

+0

वास्तव में "बॉब" उठाया। बहुत बढ़िया। मुझे लगता है कि मेरी समस्या यह थी कि मैं इस नियमित अभिव्यक्ति का इलाज कर रहा था जैसे कि उसे पूरी स्ट्रिंग से मेल खाना पड़े, जब वास्तव में मैं केवल यह पूछ रहा था कि इसमें कोई मैच है या नहीं। धन्यवाद एक गुच्छा – Chad

+0

आपको याद रखना होगा कि regexes के साथ,। और * बहुत बुरा हो सकता है। जब आप अपने रेगेक्स को तैयार करते हैं, तो आपको वास्तव में यह जानना होगा कि आप क्या खोजना चाहते हैं और केवल यही। इसमें समय लगता है, लेकिन एक बार जब आप लगातार ऐसा करते हैं, तो आप रॉक ठोस regexes के साथ खत्म हो जाएगा। मैं इस साइट, http://www.regular-expressions.info की भी सिफारिश करता हूं और आप इस पुस्तक को पढ़ते हैं, मास्टरिंग नियमित अभिव्यक्तियों, http://regex.info। – nickytonline

3

पिछले तत्व शून्य या एक बार मेल खाता है। यह {0,1} के बराबर है। ? लालची क्वांटिफायर है जिसका गैर-लालची समकक्ष है ??

here से लिया गया। साइट में नियमित अभिव्यक्तियों के लिए धोखाधड़ी शामिल है, और आपकी अभिव्यक्ति को देखते हुए मुझे लगता है कि इसमें क्या गलत हो सकता है।

मेरी धारणा यह है कि यह आपकी अभिव्यक्ति की अंतिम घटना से मेल खा सकता है।

+0

मैं गलत हो सकता था, लेकिन मुझे नहीं लगता? इस मामले में एक क्वांटिफायर है। मात्रात्मक नहीं आमतौर पर एक अभिव्यक्ति का पालन करें? – Chad

+0

अभिव्यक्ति के साथ कुछ भी गलत नहीं है, वह सिर्फ दूसरे मूल्य को देख रहा है कि यह पहले की बजाय कैप्चरिंग कर रहा है। – Rory

+0

@ चाड द? इस संदर्भ में एक नामित समूह की शुरुआत का संकेत मिलता है (अधिक विशेष रूप से नाम "नाम")। अधिकांश अन्य स्थानों में इसे क्वांटिफायर के रूप में उपयोग किया जाता है। – Rory

2

प्रत्येक समूह आइटम एक कैप्चर संग्रह है, आप का उपयोग कर एक समूह के लिए पहले कब्जा पहुँच सकते हैं:

extractor.Groups["name"].Captures[0] 
+0

पीएस प्रत्येक कैप्चर आइटम में एक वैल्यू प्रॉपर्टी होती है जो कैप्चर के वास्तविक स्ट्रिंग मान को लौटाती है, ऐसे कुछ अन्य उपयोगी गुण भी हैं जैसे इंडेक्स जिस पर कैप्चर मूल स्ट्रिंग और कैप्चर की लंबाई में शुरू होता है। संदेह में, एफ 1 मारा। – Rory

+0

हम्मम्म ... सहायक जानकारी, लेकिन कैप्चर [0] अभी भी "त्रुटि" मेरे साथ कुछ गलत अभिव्यक्ति है? – Chad

2

आपकी अभिव्यक्ति के चारों ओर ब्रैकेटिंग * वर्ण आपकी परेशानी पैदा कर रहे हैं। याद रखें कि आपको नियमित अभिव्यक्ति की आवश्यकता नहीं है जो से पूरे स्ट्रिंग से मेल खाता है - आप इसे प्रकट होने पर केवल एक विशेष पैटर्न से मिलान करना चाहते हैं। निम्नलिखित कोड काम करता है:

Regex pattern = new Regex(@"\d(?<name>.*?)\d"); 
MatchCollection matches = pattern.Matches("This hopefully will pick up 1Bob9error1 as a name"); 
Console.WriteLine(matches[0].Groups["name"]);