রেগেক্সের সাথে কেবল কয়েকটি গ্রুপ প্রতিস্থাপন করুন


190

ধরা যাক আমার কাছে নীচের রেজেক্স রয়েছে:

-(\d+)-

এবং আমি সি # টি ব্যবহার করে, গ্রুপ 1 এর (\d+)সাথে প্রতিস্থাপন করতে চাই AA:

-AA-

এখন আমি এটি ব্যবহার করে এটি প্রতিস্থাপন করছি:

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

তবে আমি সত্যিই এটি পছন্দ করি না, কারণ আমি যদি _(\d+)_পরিবর্তে প্যাটার্নটি মেলে , তবে আমাকে প্রতিস্থাপনের স্ট্রিংটিও পরিবর্তন করতে হবে _AA_এবং এটি ডিআরওয়াই নীতিবিরোধী।

আমি এরকম কিছু খুঁজছি:

ম্যাচযুক্ত পাঠ্যটি ঠিক কীভাবে রাখুন তবে গোষ্ঠী 1 দ্বারা this textএবং গ্রুপ 2 দ্বারা পরিবর্তন করুন another text...

সম্পাদনা:
এটি কেবল একটি উদাহরণ ছিল। আমি উপরে যা বলেছি তা করার একটি সাধারণ উপায় সন্ধান করছি।

এটির জন্য কাজ করা উচিত:

anything(\d+)more_text এবং যে কোনও প্যাটার্ন আপনি কল্পনা করতে পারেন।

আমি যা করতে চাই তা হ'ল কেবলমাত্র গ্রুপগুলি প্রতিস্থাপন এবং বাকি ম্যাচটি চালিয়ে যাওয়া।

উত্তর:


306

একটি ভাল ধারণা হ'ল দলগুলির অভ্যন্তরে সমস্ত কিছুকে আবদ্ধ করা যায়, সেগুলি সনাক্ত করার প্রয়োজন হয় কিনা তা বিবেচনা করার প্রয়োজন নেই। আপনি তাদের প্রতিস্থাপনের স্ট্রিং এ সেগুলি ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

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

বা ম্যাচএলুয়েটর ব্যবহার করে:

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

আরেকটু উপায়, সামান্য অগোছালো, লুকবাইন্ড / লুক হেড ব্যবহার করা যেতে পারে:

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


17
আরও তথ্য সরবরাহ করতে আমি আপনার উত্তর সম্পাদনা করেছি, তবে আপনি যা বলেছেন তা সম্পূর্ণ সঠিক। আপনি কীভাবে মিস করেছেন তা আমি জানি না যে আমি সমস্ত কিছু গোষ্ঠীর ভিতরে রেখে দিতে পারি, সেগুলি ব্যবহার করবে কি না তা নির্বিশেষে :) । আমার মতে, সমাধানটি লুক-হেড এবং লুকবিহিন্ড ব্যবহার করার চেয়ে অনেক ভাল এবং পরিষ্কার।
অস্কার মেডেরোস

ছোট টাইপ, আপনার প্রতিস্থাপন প্যাটার্নটি হতে হবে $ 1AA $ 3
মিস্টার

1
এটি কাজ করার জন্য, আমাকে ইত্যাদি যুক্ত .Valueকরতে হয়েছিলm.Groups[1]
jbeldock

10
লক্ষণীয় বিষয় - যদি আপনার প্রতিস্থাপন পাঠ্যটি একটি সংখ্যার সাথে শুরু হয়, তবে প্রথম সমাধান ("$ 1AA $ 3") উদ্দেশ্য হিসাবে কাজ করবে না!
বার্টি

2
@ অস্কারমিডেরোস আপনি নন ক্যাপচারিং গ্রুপগুলিও ব্যবহার করতে পারেন - আপনি যে গোষ্ঠী ব্যবহার করেন না তাদের পক্ষে ভাল। ইন (?:foo)(bar), $1প্রতিস্থাপন করবে barআরও বিশদ
প্যাট্রিক


19

আমারও এটির প্রয়োজন ছিল এবং আমি এটির জন্য নিম্নলিখিত এক্সটেনশন পদ্ধতিটি তৈরি করেছি:

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")]

13

আপনি যদি আপনার প্যাটার্নটি পরিবর্তন করতে না চান তবে আপনি কোনও মিলিত গোষ্ঠীর গ্রুপ সূচক এবং দৈর্ঘ্যের বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।

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;

দয়া করে নোট করুন যে এটি অনুমান করে এবং কেবল ম্যাচের প্রথম ইভেন্টের জন্য কাজ করবে।
বার্তোসজ

5

এখানে আরও একটি দুর্দান্ত পরিষ্কার বিকল্প রয়েছে যা আপনার প্যাটার্নটি পরিবর্তন করার প্রয়োজন নেই।

        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));
        });

0

পৃথক গ্রুপ প্রতিস্থাপন পেতে নীচের কোডিংয়ের মধ্য দিয়ে যান।

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.