दिलचस्प पोस्ट
sed स्क्रिप्ट में शेल चर एसटीएल में सदिश बनाम सूची Android पर SQLite डेटाबेस का अधिकतम आकार क्या है? भेजे गए एसएमएस संदेशों के लिए एंड्रॉइड ब्रॉडकास्ट रिसीवर? बिलाव सीओआरएस फिल्टर पूर्ण यूआरएल का उपयोग करते समय PHP file_get_contents बहुत धीमा है एसक्यूएल फ़ाइल को MySQL में आयात करें "अनचाहे संदर्भ" त्रुटि: यह परिभाषित नहीं है "श्रेणी के निर्माता में SceneBuilder 2.0 के लिए एक कस्टम घटक जोड़ना पायथन में स्ट्रिंग्स को कैसे परिवर्तित करें? जावा जेनेरिक्स वाइल्डकार्ड प्रश्न: सूची <? ए विस्तारित करता है एंकर (लिंक) के लिए रेखांकन कैसे हटाएं? सही सिंगलटन पैटर्न उद्देश्य सी (आईओएस)? एलएलडी, एलडी और डी टाइप आइडेंटिफ़ायर के साथ एक आकार_टी चर के printf सूची और ArrayList के बीच अंतर क्या है?

Regex के साथ केवल कुछ समूह बदलें

मान लीजिए मेरे पास निम्न रेगेक्स है:

-(\d+)- 

और मैं AA साथ ग्रुप 1 (\d+) को प्राप्त करने के लिए सी # का उपयोग करने के लिए प्रतिस्थापित करना चाहता हूं:

 -AA- 

अब मैं इसका इस्तेमाल कर रहा हूं:

 var text = "example-123-example"; var pattern = @"-(\d+)-"; var replaced = Regex.Replace(text, pattern, "-AA-"); 

लेकिन मुझे वाकई यह पसंद नहीं है, क्योंकि अगर मैं पैटर्न को _(\d+)_ से मेल करने के लिए बदलता हूं, तो मुझे _AA_ द्वारा प्रतिस्थापन स्ट्रिंग भी _AA_ , और यह DRY सिद्धांत के विरुद्ध है।

मैं कुछ की तलाश कर रहा हूँ:

मिलान टेक्स्ट ठीक तरह से रखें कि यह कैसे है, लेकिन this text समूह 1 को बदलें और another text समूह 2 को बदलें …

संपादित करें:
यह सिर्फ एक उदाहरण था। मैं सिर्फ ऊपर बताए हुए काम करने का एक सामान्य तरीका तलाश रहा हूं

इसके लिए काम करना चाहिए:

anything(\d+)more_text और आप कल्पना कर सकते हैं कोई भी पैटर्न।

मैं जो करना चाहता हूं, वह केवल समूहों को बदलता है, और शेष मैच को बनाए रखता है।

वेब के समाधान से एकत्रित समाधान "Regex के साथ केवल कुछ समूह बदलें"

एक अच्छा विचार हो सकता है कि समूह के अंदर सब कुछ शामिल किया जाए, चाहे उन्हें पहचानने की आवश्यकता हो या न हो। इस तरह आप अपने प्रतिस्थापन स्ट्रिंग में उनका उपयोग कर सकते हैं। उदाहरण के लिए:

 var pattern = @"(-)(\d+)(-)"; var replaced = Regex.Replace(text, pattern, "$1AA$3"); 

या एक MatchEvaluator का उपयोग कर:

 var replaced = Regex.Replace(text, pattern, m => m.Groups[1].Value + "AA" + m.Groups[3].Value); 

एक और तरीका है, थोड़ा गड़बड़, एक नजरबीर / lookahead का उपयोग कर सकते हैं:

(?<=-)(\d+)(?=-)

आप इसे लेटरहाइड के साथ कर सकते हैं और देखें :

 var pattern = @"(?<=-)\d+(?=-)"; var replaced = Regex.Replace(text, pattern, "AA"); 

यदि आप अपने पैटर्न को बदलना नहीं चाहते हैं तो आप किसी मिलान समूह के समूह सूचकांक और लंबाई गुणों का उपयोग कर सकते हैं।

 var text = "example-123-example"; var pattern = @"-(\d+)-"; var regex = new RegEx(pattern); var match = regex.Match(text); var firstPart = text.Substring(0,match.Groups[1].Index); var secondPart = text.Substring(match.Groups[1].Index + match.Groups[1].Length); var fullReplace = firstPart + "AA" + secondPart; 

इसके लिए मुझे इसके लिए भी ज़रूरत थी और इसके लिए मैंने निम्नलिखित एक्सटेंशन विधि बनाई है:

 public static class RegexExtensions { public static string ReplaceGroup( this Regex regex, string input, string groupName, string replacement) { return regex.Replace( input, m => { var group = m.Groups[groupName]; var sb = new StringBuilder(); var previousCaptureEnd = 0; foreach (var capture in group.Captures.Cast<Capture>()) { var currentCaptureEnd = capture.Index + capture.Length - m.Index; var currentCaptureLength = capture.Index - m.Index - previousCaptureEnd; sb.Append( m.Value.Substring( previousCaptureEnd, currentCaptureLength)); sb.Append(replacement); previousCaptureEnd = currentCaptureEnd; } sb.Append(m.Value.Substring(previousCaptureEnd)); return sb.ToString(); }); } } 

उपयोग:

 var input = @"[assembly: AssemblyFileVersion(""2.0.3.0"")][assembly: AssemblyFileVersion(""2.0.3.0"")]"; var regex = new Regex(@"AssemblyFileVersion\(""(?<version>(\d+\.?){4})""\)"); var result = regex.ReplaceGroup(input , "version", "1.2.3"); 

परिणाम:

 [assembly: AssemblyFileVersion("1.2.3")][assembly: AssemblyFileVersion("1.2.3")] 

यहां एक और अच्छा साफ विकल्प है जो आपके पैटर्न को बदलने की आवश्यकता नहीं है।

  var text = "example-123-example"; var pattern = @"-(\d+)-"; var replaced = Regex.Replace(text, pattern, (_match) => { Group group = _match.Groups[1]; string replace = "AA"; return String.Format("{0}{1}{2}", _match.Value.Substring(0, group.Index - _match.Index), replace, _match.Value.Substring(group.Index - _match.Index + group.Length)); }); 

अलग समूह प्रतिस्थापन पाने के लिए नीचे कोडिंग के माध्यम से जाना

 new_bib = Regex.Replace(new_bib, @"(?s)(\\bibitem\[[^\]]+\]\{" + pat4 + @"\})[\s\n\v]*([\\\{\}a-zA-Z\.\s\,\;\\\#\\\$\\\%\\\&\*\@\\\!\\\^+\-\\\=\\\~\\\:\\\" + dblqt + @"\\\;\\\`\\\']{20,70})", delegate(Match mts) { var fg = mts.Groups[0].Value.ToString(); var fs = mts.Groups[1].Value.ToString(); var fss = mts.Groups[2].Value.ToString(); fss = Regex.Replace(fss, @"[\\\{\}\\\#\\\$\\\%\\\&\*\@\\\!\\\^+\-\\\=\\\~\\\:\\\" + dblqt + @"\\\;\\\`\\\']+", ""); return "<augroup>" + fss + "</augroup>" + fs; }, RegexOptions.IgnoreCase);