2012-06-15 11 views
7

मेरे पास समूहित मानों की एक श्रृंखला है जो एक विशिष्ट प्रारूप का पालन करती है और उन्हें समूहों में कैप्चर करने के लिए एक अभिव्यक्ति का उपयोग करना चाहती है। उदाहरण के लिए, मेरे पास -group1 -group2 -group3 है और (-[\s\S]{1,}?) के समान कुछ उपयोग करने का प्रयास कर रहा हूं यह मूल रूप से मुझे एक स्ट्रिंग में पूरी स्ट्रिंग को कैप्चर करने की इजाजत दे रहा है, लेकिन मैं प्रत्येक मान को अलग-अलग बैकरेफर करने में सक्षम होना चाहता हूं। मैंने पाया कि ? इसे गैर लालची होने के लिए मजबूर करेगा और इसलिए, पैटर्न मिलान को तीन अलग-अलग समूहों (उदाहरण के लिए) में विभाजित करें। अभी के लिए मैं बस संदर्भ (-[\s\S]*?) दोहरा रहा हूं लेकिन ऐसा लगता है कि एक और अधिक सुंदर अभिव्यक्ति होना चाहिए।
धन्यवाद!दोहराने वाले समूहों का चयन करने के लिए नियमित अभिव्यक्ति

+0

यह कुछ अस्पष्ट है। क्या आप कुछ नमूना पाठ और अपेक्षित समूहीकरण परिणाम दिखा सकते हैं, जिसमें आप पीछे हटने का इरादा रखते हैं? –

+0

वैसे, '[\ s \ S]' कहता है "किसी भी स्थान या गैर-अंतरिक्ष चरित्र से मिलान करें"। उसके बारे में सोचना। ;) – qJake

उत्तर

14

क्योंकि सी # कुछ भाषाओं में से एक (यदि नहीं केवल एक) है आप भाग्यशाली हैं उपसूचक का समर्थन करता है कि कब्जा

https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)

नेट एपीआई के रूप में

Matches 
    Groups (most regex engines stop here) 
     Captures (unique for .NET) 
इस प्रकार को देखा जा सकता है

यह आपके प्रश्न से स्पष्ट नहीं है कि आप वास्तव में क्या मिलान करना चाहते हैं लेकिन यह आपको प्रारंभ करना चाहिए। अगर आप फंस गए हैं तो फिर से पूछें।

string input = "-group1 -group2 "; 
    string pattern = @"(-\S*\W){2}"; 
    foreach (Match match in Regex.Matches(input, pattern)) 
    { 
    Console.WriteLine("Match: {0}", match.Value); 
    for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++) 
    { 
     Group group = match.Groups[groupCtr]; 
     Console.WriteLine(" Group {0}: {1}", groupCtr, group.Value); 
     for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++) 
      Console.WriteLine("  Capture {0}: {1}", captureCtr, 
          group.Captures[captureCtr].Value); 
    }      
    } 

यह

Match: -group1 -group2 
    Group 0: -group1 -group2 
     Capture 0: -group1 -group2 
    Group 1: -group2 
     Capture 0: -group1 
     Capture 1: -group2 

ouputs आप देख सकते हैं (समूह 1, कैप्चर 0) और (समूह 1, 1 कैप्चर) सबसे में के रूप में एक समूह के व्यक्तिगत कैप्चर की पेशकश (और नहीं पिछले भाषाओं)

यह पता है कि मैं क्या आप के रूप में वर्णन के बारे में सोच लेकिन

(आप अवधि backreference का उपयोग करें "अलग से प्रत्येक मान के backreference करने में सक्षम हो" मुझे नहीं लगता कि आप ar के लिए लक्ष्य कर रहे हैं प्रतिस्थापन पैटर्न सही?)

+1

+1। मुझे विश्वास है कि वह वही है जो वह भी मांग रहा था। एक तरफ के रूप में, PHP इसे 'preg_match_all (...) '' समारोह; 'PREG_SET_ORDER'' ध्वज का उपयोग करके, यह एक बहु-आयामी सरणी देता है, पहला सेट जिसमें पहला सेट होता है, दूसरा सेट जिसमें दूसरा सेट होता है, आदि (अन्य झंडे अलग-अलग प्रतिनिधित्वों की अनुमति देते हैं।) मेरा अनुमान है कि यदि .NET और PHP ने इसे लागू किया है, अन्य भाषाओं में भी है। –

+0

@ acheong87 अच्छी टिप्पणी, मैं इसे अन्य भाषाओं को अपमानित करने के उत्तर में जोड़ूंगा :) मेरे पास यह regexp विशेषज्ञ Jan Goyvaerts से है कि .NET इस पहलू पर अद्वितीय था लेकिन मैं इसे वापस करने के लिए अन्य प्लेटफ़ॉर्म पर पर्याप्त सक्रिय नहीं हूं अप। – buckley

+2

@ acheong87, यह वही बात नहीं है। 'preg_match_all()' बार-बार regex लागू करता है और एकत्रित परिणाम देता है, .NET की 'मिलान()' विधि के समान। ओपी * एक * मैच करना चाहता है जो पूरे स्ट्रिंग का उपभोग करेगा, फिर व्यक्तिगत कैप्चर को तोड़ देगा। .NET उस उद्देश्य के लिए 'कैप्चर कोलेक्शन' प्रदान करता है, लेकिन PHP के बराबर नहीं है। –

0

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

(-.+?)(\s|$) 

आपका पहला कब्जा समूह आप क्या चाहते हैं (-group1, -group2, आदि) होगा।

आप क्या - के बाद अनुमति देने के लिए पर अधिक नियंत्रण चाहते हैं, तो बदल .+?, उदाहरण के लिए, [a-zA-Z0-9]+? केवल अक्षरांकीय अक्षर से मेल करने के लिए।

2

नेट regex (और लगभग केवल .NET) के साथ आप उपयोग कर सकते हैं:

(?:(-\S+)\s*)+ 

समूह 1 सभी मिलान सबस्ट्रिंग की एक सूची में शामिल होंगे।

या हो सकता है सिर्फ Matches का उपयोग कर अपने मामले में पर्याप्त है:

var re = new Regex(@"-\S+"); 
var matches = re.Matches(str); 
संबंधित मुद्दे