मेरे पास समूहित मानों की एक श्रृंखला है जो एक विशिष्ट प्रारूप का पालन करती है और उन्हें समूहों में कैप्चर करने के लिए एक अभिव्यक्ति का उपयोग करना चाहती है। उदाहरण के लिए, मेरे पास -group1 -group2 -group3
है और (-[\s\S]{1,}?)
के समान कुछ उपयोग करने का प्रयास कर रहा हूं यह मूल रूप से मुझे एक स्ट्रिंग में पूरी स्ट्रिंग को कैप्चर करने की इजाजत दे रहा है, लेकिन मैं प्रत्येक मान को अलग-अलग बैकरेफर करने में सक्षम होना चाहता हूं। मैंने पाया कि ?
इसे गैर लालची होने के लिए मजबूर करेगा और इसलिए, पैटर्न मिलान को तीन अलग-अलग समूहों (उदाहरण के लिए) में विभाजित करें। अभी के लिए मैं बस संदर्भ (-[\s\S]*?)
दोहरा रहा हूं लेकिन ऐसा लगता है कि एक और अधिक सुंदर अभिव्यक्ति होना चाहिए।
धन्यवाद!दोहराने वाले समूहों का चयन करने के लिए नियमित अभिव्यक्ति
उत्तर
क्योंकि सी # कुछ भाषाओं में से एक (यदि नहीं केवल एक) है आप भाग्यशाली हैं उपसूचक का समर्थन करता है कि कब्जा
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। मुझे विश्वास है कि वह वही है जो वह भी मांग रहा था। एक तरफ के रूप में, PHP इसे 'preg_match_all (...) '' समारोह; 'PREG_SET_ORDER'' ध्वज का उपयोग करके, यह एक बहु-आयामी सरणी देता है, पहला सेट जिसमें पहला सेट होता है, दूसरा सेट जिसमें दूसरा सेट होता है, आदि (अन्य झंडे अलग-अलग प्रतिनिधित्वों की अनुमति देते हैं।) मेरा अनुमान है कि यदि .NET और PHP ने इसे लागू किया है, अन्य भाषाओं में भी है। –
@ acheong87 अच्छी टिप्पणी, मैं इसे अन्य भाषाओं को अपमानित करने के उत्तर में जोड़ूंगा :) मेरे पास यह regexp विशेषज्ञ Jan Goyvaerts से है कि .NET इस पहलू पर अद्वितीय था लेकिन मैं इसे वापस करने के लिए अन्य प्लेटफ़ॉर्म पर पर्याप्त सक्रिय नहीं हूं अप। – buckley
@ acheong87, यह वही बात नहीं है। 'preg_match_all()' बार-बार regex लागू करता है और एकत्रित परिणाम देता है, .NET की 'मिलान()' विधि के समान। ओपी * एक * मैच करना चाहता है जो पूरे स्ट्रिंग का उपभोग करेगा, फिर व्यक्तिगत कैप्चर को तोड़ देगा। .NET उस उद्देश्य के लिए 'कैप्चर कोलेक्शन' प्रदान करता है, लेकिन PHP के बराबर नहीं है। –
इस प्रयास करें:
(-.+?)(\s|$)
आपका पहला कब्जा समूह आप क्या चाहते हैं (-group1
, -group2
, आदि) होगा।
आप क्या -
के बाद अनुमति देने के लिए पर अधिक नियंत्रण चाहते हैं, तो बदल .+?
, उदाहरण के लिए, [a-zA-Z0-9]+?
केवल अक्षरांकीय अक्षर से मेल करने के लिए।
नेट regex (और लगभग केवल .NET) के साथ आप उपयोग कर सकते हैं:
(?:(-\S+)\s*)+
समूह 1 सभी मिलान सबस्ट्रिंग की एक सूची में शामिल होंगे।
या हो सकता है सिर्फ Matches
का उपयोग कर अपने मामले में पर्याप्त है:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
- 1. माइस्क्ल नियमित अभिव्यक्ति खोज दोहराने वाले वर्णों के साथ
- 2. जावास्क्रिप्ट नियमित अभिव्यक्ति इटरेटर को निकालने के लिए समूहों
- 3. स्काला: मिलान वैकल्पिक नियमित अभिव्यक्ति समूहों
- 4. अजगर नियमित अभिव्यक्ति नाम के समूहों को असाइन
- 5. नियमित अभिव्यक्ति मिलान करने के लिए "|"
- 6. जावा, नियमित अभिव्यक्ति, करने के लिए regex
- 7. एक संपूर्ण लाइन का चयन करने के लिए नियमित अभिव्यक्ति जिसमें HTML कक्षा
- 8. शब्दकोष के लिए नियमित अभिव्यक्ति
- 9. समय के लिए नियमित अभिव्यक्ति
- 10. अंग्रेजी के लिए नियमित अभिव्यक्ति
- 11. sprintf - दोहराने वाले तर्क
- 12. WPF दोहराने वाले तत्व
- 13. नियमित अभिव्यक्ति वाक्य
- 14. नियमित अभिव्यक्ति उत्पन्न करने के लिए अंतिम उपयोगकर्ता उपकरण
- 15. बूस्ट :: regex_search के साथ दोहराने वाले समूह के सभी मैचों को कैप्चर कैसे करूं?
- 16. केवल नियमित अभिव्यक्ति से मेल खाने वाले परीक्षण निष्पादित करने के लिए कैसे करें?
- 17. नियमित अभिव्यक्ति
- 18. नियमित अभिव्यक्ति
- 19. नियमित अभिव्यक्ति?
- 20. नियमित अभिव्यक्ति
- 21. नियमित अभिव्यक्ति
- 22. नियमित अभिव्यक्ति
- 23. नियमित अभिव्यक्तियों का उपयोग करने या नहीं करने के लिए?
- 24. नियमित अभिव्यक्ति के विपरीत
- 25. नियमित अभिव्यक्ति कार्यान्वयन विवरण
- 26. नियमित अभिव्यक्ति का उपयोग कैसे करें "30M1000N20M"
- 27. नियमित अभिव्यक्ति?
- 28. नियमित अभिव्यक्ति
- 29. jQuery चयनकर्ता नियमित अभिव्यक्ति
- 30. नियमित अभिव्यक्तियों का उपयोग करके जावास्क्रिप्ट में सबसे लंबे समय तक दोहराने वाले सबस्ट्रिंग का पता लगाएं
यह कुछ अस्पष्ट है। क्या आप कुछ नमूना पाठ और अपेक्षित समूहीकरण परिणाम दिखा सकते हैं, जिसमें आप पीछे हटने का इरादा रखते हैं? –
वैसे, '[\ s \ S]' कहता है "किसी भी स्थान या गैर-अंतरिक्ष चरित्र से मिलान करें"। उसके बारे में सोचना। ;) – qJake