স্ট্রিংয়ের বিকল্প আছে কি? প্রতিস্থাপন যা কেস-সংবেদনশীল?


306

আমাকে একটি স্ট্রিং অনুসন্ধান করতে হবে এবং সমস্ত উপস্থিতি %FirstName%এবং %PolicyAmount%একটি ডাটাবেস থেকে টানা মান সহ প্রতিস্থাপন করতে হবে । সমস্যাটি ফার্সনামের মূলধন পরিবর্তিত হয়। এটি আমাকে String.Replace()পদ্ধতিটি ব্যবহার করতে বাধা দেয় । আমি সেই বিষয়ে ওয়েব পৃষ্ঠাগুলি দেখেছি যা পরামর্শ দেয়

Regex.Replace(strInput, strToken, strReplaceWith, RegexOptions.IgnoreCase);

তবে কোনো কারণে যখন আমি চেষ্টা এবং প্রতিস্থাপন জন্য %PolicyAmount%সঙ্গে $0, প্রতিস্থাপন না সঞ্চালিত হয়। আমি ধরে নিই যে রেগেক্সে ডলার সাইন একটি সংরক্ষিত চরিত্র হিসাবে এটির কিছু ছিল।

আমি অন্য কোন পদ্ধতি ব্যবহার করতে পারি যা রেজেক্স বিশেষ চরিত্রগুলির সাথে কাজ করার জন্য ইনপুটটিকে স্যানিটাইজিং জড়িত করে না?


1
যদি "$ 0" পরিবর্তনশীল হয় তবে এটি রেজেেক্সকে মোটেই প্রভাবিত করে না।
cfeduke

উত্তর:


132

এমএসডিএন
$ 0 থেকে - "গ্রুপ নম্বর নম্বর (দশমিক) দ্বারা মিলিত সর্বশেষ স্ট্রিংটি প্রতিস্থাপিত করে" "

ইন নেট নিয়মিত এক্সপ্রেশন গ্রুপ 0 সর্বদা পুরো ম্যাচ। আক্ষরিক জন্য - আপনার প্রয়োজন

string value = Regex.Replace("%PolicyAmount%", "%PolicyAmount%", @"$$0", RegexOptions.IgnoreCase);

16
এই বিশেষ ক্ষেত্রে এটি ঠিক আছে, তবে ক্ষেত্রেগুলি স্ট্রিংগুলি বাইরে থেকে ইনপুট হয় এমন ক্ষেত্রে, কেউ নিশ্চিত হতে পারে না যে
এগুলিতে

23
আপনার এর মতো বিশেষ অক্ষরগুলি থেকে বাঁচতে হবে: স্ট্রিং মান = রেইজেক্স R রিপ্লেস ("% পলিসিমাউন্ট%", রিজেক্স.এস্কেপ ("% পলিসিমাউন্ট%"), রিজেক্সস.সেকপ ("$ 0"), রিজেক্সঅপশনস।আইগনরেসেস);
হেলিজ ক্লিন

8
Regex.Remplaces এ Regex.Ecreen ব্যবহার করার সময় দয়া করে দেখুন। আপনাকে পাস করা তিনটি স্ট্রিংয়ের সমস্তটি ছেড়ে পালাতে হবে এবং ফলাফলটির ভিত্তিতে রিজেক্সকে ডেকে আনবে! ইউনস্কেপ!
হলগার আদম

4
এমএসডিএন অনুসারে: "চরিত্রের পলায়নগুলি নিয়মিত প্রকাশের প্যাটার্নগুলিতে স্বীকৃত হয় তবে প্রতিস্থাপনের ধরণগুলিতে নয়" " ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/4edbef7e.aspx )
ব্রোনেক

1
এটি ব্যবহার করা সবচেয়ে ভাল: স্ট্রিংয়ের মান = রিজেক্স R রিপ্লেস ("% পলিসিমাউন্ট%", রিজেক্স.এস্কেপ ("% পলিসিমাউন্ট%"), "$ 0"। রিপ্লেস ("$", "$$"), রিজেক্সঅপশনস।আইগনরেসেস); প্রতিস্থাপন হিসাবে শুধুমাত্র ডলার চিহ্ন স্বীকৃতি।
স্কোরেক

295

দেখে মনে হচ্ছে একটি ওভারলোড string.Replace হওয়া উচিত যা একটি StringComparisonযুক্তি নিয়ে নেয় । যেহেতু এটি হয় না, আপনি এরকম কিছু চেষ্টা করতে পারেন:

public static string ReplaceString(string str, string oldValue, string newValue, StringComparison comparison)
{
    StringBuilder sb = new StringBuilder();

    int previousIndex = 0;
    int index = str.IndexOf(oldValue, comparison);
    while (index != -1)
    {
        sb.Append(str.Substring(previousIndex, index - previousIndex));
        sb.Append(newValue);
        index += oldValue.Length;

        previousIndex = index;
        index = str.IndexOf(oldValue, index, comparison);
    }
    sb.Append(str.Substring(previousIndex));

    return sb.ToString();
}

9
খুশী হলাম। আমি পরিবর্তন ReplaceStringকরতে হবে Replace
এমিসিকো

41
উপরের মন্তব্যে একমত এটি একই পদ্ধতির নাম সহ একটি এক্সটেনশন পদ্ধতিতে তৈরি করা যেতে পারে। কেবল পদ্ধতিটির স্বাক্ষর সহ একটি স্ট্যাটিক শ্রেণিতে এটি পপ করুন: পাবলিক স্ট্যাটিক স্ট্রিং প্রতিস্থাপন করুন (এই স্ট্রিং স্ট্রিং, স্ট্রিং ওল্ডভ্যালু, স্ট্রিং নিউভ্যালু, স্ট্রিংকম্পিয়ার তুলনা)
মার্ক রবিনসন

8
@ হেল্জ, সাধারণভাবে, এটি ঠিকঠাক হতে পারে তবে ব্যবহারকারীর কাছ থেকে আমাকে নির্বিচারে স্ট্রিং নিতে হবে এবং ইনপুটটি রিজেক্সের অর্থবহ বলে ঝুঁকি নিতে পারে না। অবশ্যই, আমি অনুমান করি যে আমি একটি লুপ লিখতে এবং প্রতিটি চরিত্রের সামনে একটি ব্যাকস্ল্যাশ রাখতে পারি ... সেই সময়ে, আমি উপরেরটি (আইএমএইচও )ও করতে পারি।
জিম

9
ইউনিট এটির পরীক্ষা করার সময় আমি এমন মামলায় ছুটে এসেছি যেখানে কখন ফিরে আসবে না oldValue == newValue == ""
ইসমাইল

10
এটি বগি; ReplaceString("œ", "oe", "", StringComparison.InvariantCulture)ছোঁড়ার ArgumentOutOfRangeException
মাইকেল লিউ

45

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

এখানে একটি এক্সটেনশন পদ্ধতি যা আমি মনে করি যে এখানে বর্ণিত সমস্যাগুলি এড়িয়ে চলে এবং সর্বাধিক বিস্তৃত প্রয়োগযোগ্য সমাধান সরবরাহ করে।

public static string ReplaceCaseInsensitiveFind(this string str, string findMe,
    string newValue)
{
    return Regex.Replace(str,
        Regex.Escape(findMe),
        Regex.Replace(newValue, "\\$[0-9]+", @"$$$0"),
        RegexOptions.IgnoreCase);
}

তাই ...

দুর্ভাগ্যক্রমে, আপনার Escapeতিনটি ব্যক্তিরই @A- এর মন্তব্য সঠিক নয় । প্রাথমিক মান এবং newValueএটির দরকার নেই।

দ্রষ্টব্য: যাইহোক, $আপনি যে নতুন মানটি সন্নিবেশ করছেন তা পালাতে হবে, যদি তারা "ক্যাপচারড মান" চিহ্নিতকারী হিসাবে উপস্থিত হয় এমন অংশ হয় । এইভাবে তিনটি ডলারের রেজিজেটে চিহ্ন। রেগেক্সের অভ্যন্তরে স্থানান্তর করুন ep প্রতিস্থাপন [sic]। তা ছাড়া, এই জাতীয় কিছু বিরতি ...

"This is HIS fork, hIs spoon, hissssssss knife.".ReplaceCaseInsensitiveFind("his", @"he$0r")

ত্রুটি এখানে:

An unhandled exception of type 'System.ArgumentException' occurred in System.dll

Additional information: parsing "The\hisr\ is\ he\HISr\ fork,\ he\hIsr\ spoon,\ he\hisrsssssss\ knife\." - Unrecognized escape sequence \h.

আপনাকে কী বলব, রেগেক্সের সাথে স্বাচ্ছন্দ্যযুক্ত লোকেরা তাদের ব্যবহারগুলি ত্রুটিগুলি এড়ানোর মতো বোধ করে তবে আমি প্রায়শই স্নিফিং স্ট্রিংগুলি বাইট করতে পারি (তবে কেবল এনকোডিংগুলিতে স্পলস্কি পড়ার পরে ) আপনি কী পাচ্ছেন তা নিশ্চিত হওয়ার জন্য গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে জন্য উদ্দেশ্যে। ক্রোকফোর্ডকে " সুরক্ষিত নিয়মিত অভিব্যক্তি " একটু স্মরণ করিয়ে দেয় । আমরা প্রায়শই রিজেক্সপস লিখি যা আমরা যা চাই তা অনুমোদন করি (যদি আমরা ভাগ্যবান) তবে অজান্তেই আরও কিছুতে অনুমতি দিন (উদাহরণস্বরূপ, $10আমার নিউভ্যালু রিজেক্সেপটিতে কি আসলেই একটি বৈধ "ক্যাপচার মান" স্ট্রিং আছে?) কারণ আমরা যথেষ্ট চিন্তাশীল ছিলাম না । উভয় পদ্ধতিরই মূল্য রয়েছে এবং উভয়ই বিভিন্ন ধরণের অনিচ্ছাকৃত ত্রুটিগুলি উত্সাহিত করে। জটিলতা কম করে দেখানো প্রায়শই সহজ।

সেই অদ্ভুত $পালানো (এবং এটি প্রতিস্থাপনের মানগুলিতে যেমন প্রত্যাশা করা হত যেমন Regex.Escapeবন্দী মানের ধরণগুলি এড়ায়নি $0) আমাকে কিছুক্ষণের জন্য উন্মাদ করেছিল। প্রোগ্রামিং শক্ত (গ) 1842


32

এখানে একটি এক্সটেনশন পদ্ধতি। আমি এটি কোথায় পেয়েছি তা নিশ্চিত নয়।

public static class StringExtensions
{
    public static string Replace(this string originalString, string oldValue, string newValue, StringComparison comparisonType)
    {
        int startIndex = 0;
        while (true)
        {
            startIndex = originalString.IndexOf(oldValue, startIndex, comparisonType);
            if (startIndex == -1)
                break;

            originalString = originalString.Substring(0, startIndex) + newValue + originalString.Substring(startIndex + oldValue.Length);

            startIndex += newValue.Length;
        }

        return originalString;
    }

}

আপনার খালি / নাল স্ট্রিং কেসগুলি পরিচালনা করতে হতে পারে।
ভাদ

2
এই সমাধানে একাধিক ত্রুটি: 1. নালীর জন্য অরিজিনাল স্ট্রিং, ওল্ডভ্যালু এবং নতুন ভ্যালু পরীক্ষা করুন। ২.আরগিনাল স্ট্রিংকে পিছনে দেবেন না (কাজ করে না, সাধারণ প্রকারগুলি রেফারেন্স দিয়ে পাস হয় না) তবে প্রথমে একটি নতুন স্ট্রিংয়ে অরগিনালভ্যালুর মান নির্ধারণ করুন এবং এটি পরিবর্তন করুন এবং এটি আবার দিন give
আরডাব্লুসি

31

সবচেয়ে সহজ পদ্ধিতিটি হ'ল নেটটি দিয়ে জাহাজ বদলানো পদ্ধতিটি ব্যবহার করা সহজ বলে মনে হয় এবং নেট থেকে শুরু হয়েছে এবং নেট। 1.0:

string res = Microsoft.VisualBasic.Strings.Replace(res, 
                                   "%PolicyAmount%", 
                                   "$0", 
                                   Compare: Microsoft.VisualBasic.CompareMethod.Text);

এই পদ্ধতিটি ব্যবহার করার জন্য আপনাকে মাইক্রোসফ্টের একটি রেফারেন্স যুক্ত করতে হবে is ভিজুয়ালবাসিক সমাবেশে। এই সমাবেশটি। নেট রানটাইমের একটি স্ট্যান্ডার্ড অংশ, এটি কোনও অতিরিক্ত ডাউনলোড নয় বা অপ্রচলিত হিসাবে চিহ্নিত নয়।


4
এটা কাজ করে। আপনাকে মাইক্রোসফ্ট.ভিউজুয়াল বেসিক অ্যাসেমব্লিতে একটি রেফারেন্স যুক্ত করতে হবে।
ক্লিভারপ্যাট্রিক

আশ্চর্যজনক যে আমি যখন এটি ব্যবহার করি তখন এই পদ্ধতিতে কিছু সমস্যা হয়েছিল (লাইনের শুরুতে অক্ষরগুলি অনুপস্থিত)। C. Dragon 76প্রত্যাশার মতো কাজ করা থেকে এখানে সবচেয়ে জনপ্রিয় উত্তর ।
জেরেমি থম্পসন

1
এটির সাথে সমস্যাটি হ'ল এটি কোনও নতুন স্ট্রিং ফিরিয়ে দেয় এমনকি কোনও প্রতিস্থাপন তৈরি না করা হলেও, যেখানে স্ট্রিং.রেপ্লেস () একই স্ট্রিংটিতে একটি পয়েন্টার দেয়। আপনি যদি কোনও ফর্ম চিঠির মার্জ করার মতো কিছু করছেন তবে অদক্ষ হয়ে উঠতে পারেন।
Brain2000

4
Brain2000, আপনি ভুল .NET এর সমস্ত স্ট্রিং অপরিবর্তনীয়।
ডের_মিস্টার

ডের_মিস্টার, আপনি যা বলছেন তা সঠিক, এটি ব্রেন 2000 যা ভুল বলেছে তা করে না।
সাইমন হিউট

11
    /// <summary>
    /// A case insenstive replace function.
    /// </summary>
    /// <param name="originalString">The string to examine.(HayStack)</param>
    /// <param name="oldValue">The value to replace.(Needle)</param>
    /// <param name="newValue">The new value to be inserted</param>
    /// <returns>A string</returns>
    public static string CaseInsenstiveReplace(string originalString, string oldValue, string newValue)
    {
        Regex regEx = new Regex(oldValue,
           RegexOptions.IgnoreCase | RegexOptions.Multiline);
        return regEx.Replace(originalString, newValue);
    }

কোনটি ভাল উপায়? স্ট্যাকওভারফ্লো . com/a/244933/206730 সম্পর্কে কী ? ভাল পারফরম্যান্স?
কিকিনেট

8

সিএফডুকের উত্তরে অনুপ্রাণিত হয়ে, আমি এই ফাংশনটি তৈরি করেছি যা স্ট্রিংয়ে পুরানো মান সন্ধান করতে সূচিপত্র ব্যবহার করে এবং তারপরে নতুন মানের সাথে প্রতিস্থাপন করে। আমি এটি কয়েক মিলিয়ন সারি প্রক্রিয়াকরণকারী একটি এসএসআইএস স্ক্রিপ্টে ব্যবহার করেছি এবং রেজেক্স-পদ্ধতিটি এর চেয়ে ধীরে ধীরে ধীর ছিল।

public static string ReplaceCaseInsensitive(this string str, string oldValue, string newValue)
{
    int prevPos = 0;
    string retval = str;
    // find the first occurence of oldValue
    int pos = retval.IndexOf(oldValue, StringComparison.InvariantCultureIgnoreCase);

    while (pos > -1)
    {
        // remove oldValue from the string
        retval = retval.Remove(pos, oldValue.Length);

        // insert newValue in it's place
        retval = retval.Insert(pos, newValue);

        // check if oldValue is found further down
        prevPos = pos + newValue.Length;
        pos = retval.IndexOf(oldValue, prevPos, StringComparison.InvariantCultureIgnoreCase);
    }

    return retval;
}

যখন প্রয়োজন হয় না তখন রেজেক্স ব্যবহার না করার জন্য +1। অবশ্যই, আপনি কোডের কয়েকটি আরও লাইন ব্যবহার করেন তবে রেগেক্স-ভিত্তিক প্রতিস্থাপনের তুলনায় এটি আরও কার্যকর unless যদি না আপনার $ কার্যকারিতা প্রয়োজন।
ক্রিসজি

6

ডি কোডালReplace পদ্ধতিটি ওভারলোড করে এমন একটি এক্সটেনশনে তার কোড তৈরি করে সি ড্রাগন 76 76 এর জনপ্রিয় উত্তরটি প্রসারিত করা হচ্ছে ।

public static class StringExtensions
{
    public static string Replace(this string str, string oldValue, string newValue, StringComparison comparison)
    {
        StringBuilder sb = new StringBuilder();

        int previousIndex = 0;
        int index = str.IndexOf(oldValue, comparison);
        while (index != -1)
        {
            sb.Append(str.Substring(previousIndex, index - previousIndex));
            sb.Append(newValue);
            index += oldValue.Length;

            previousIndex = index;
            index = str.IndexOf(oldValue, index, comparison);
        }
        sb.Append(str.Substring(previousIndex));
        return sb.ToString();
     }
}

3

কিছু অপটিমাইজেশন এবং বৈধতা সহ জেফ রেড্ডির উত্তরের ভিত্তিতে:

public static string Replace(string str, string oldValue, string newValue, StringComparison comparison)
{
    if (oldValue == null)
        throw new ArgumentNullException("oldValue");
    if (oldValue.Length == 0)
        throw new ArgumentException("String cannot be of zero length.", "oldValue");

    StringBuilder sb = null;

    int startIndex = 0;
    int foundIndex = str.IndexOf(oldValue, comparison);
    while (foundIndex != -1)
    {
        if (sb == null)
            sb = new StringBuilder(str.Length + (newValue != null ? Math.Max(0, 5 * (newValue.Length - oldValue.Length)) : 0));
        sb.Append(str, startIndex, foundIndex - startIndex);
        sb.Append(newValue);

        startIndex = foundIndex + oldValue.Length;
        foundIndex = str.IndexOf(oldValue, startIndex, comparison);
    }

    if (startIndex == 0)
        return str;
    sb.Append(str, startIndex, str.Length - startIndex);
    return sb.ToString();
}

2

সি ড্রাগন এর অনুরূপ একটি সংস্করণ তবে আপনার যদি কেবল একটি একক প্রতিস্থাপনের প্রয়োজন হয় তবে:

int n = myText.IndexOf(oldValue, System.StringComparison.InvariantCultureIgnoreCase);
if (n >= 0)
{
    myText = myText.Substring(0, n)
        + newValue
        + myText.Substring(n + oldValue.Length);
}

1

রেজেেক্স রিপ্লেসমেন্টগুলি সম্পাদন করার জন্য এখানে আরও একটি বিকল্প রয়েছে, যেহেতু অনেক লোকের মনে হয় না মিলগুলি স্ট্রিংয়ের মধ্যে অবস্থান করে:

    public static string ReplaceCaseInsensative( this string s, string oldValue, string newValue ) {
        var sb = new StringBuilder(s);
        int offset = oldValue.Length - newValue.Length;
        int matchNo = 0;
        foreach (Match match in Regex.Matches(s, Regex.Escape(oldValue), RegexOptions.IgnoreCase))
        {
            sb.Remove(match.Index - (offset * matchNo), match.Length).Insert(match.Index - (offset * matchNo), newValue);
            matchNo++;
        }
        return sb.ToString();
    }

আপনি ব্যাখ্যা করতে পারেন কেন আপনি ম্যাচনো দ্বারা গুণ করছেন?
অহেহো

যদি পুরানোভ্যালু এবং নিউভ্যালুতে দৈর্ঘ্যের মধ্যে পার্থক্য থাকে তবে মানগুলি প্রতিস্থাপন করার সাথে স্ট্রিংটি দীর্ঘ বা সংক্ষিপ্ত হয়ে উঠবে। ম্যাচ.ইনডেক্স স্ট্রিংয়ের মধ্যে মূল অবস্থান বোঝায়, আমাদের প্রতিস্থাপনের কারণে আমাদের সেই অবস্থানের আন্দোলনের জন্য সামঞ্জস্য করা দরকার। আরেকটি উপায় হ'ল ডান থেকে বামে সরান / সন্নিবেশ করানো।
ব্র্যান্ডন

আমি তা পেয়েছি "অফসেট" ভেরিয়েবল এটাই। আমি যা বুঝতে পারি না তা হ'ল আপনি কেন ম্যাচ নম্বরে গুণাচ্ছেন। আমার স্বজ্ঞাততা আমাকে বলে যে একটি স্ট্রিংয়ের মধ্যে একটি মিলের অবস্থানের আগের ঘটনাগুলির প্রকৃত গণনার সাথে কোনও সম্পর্ক থাকবে না।
Aheho

কিছু মনে করবেন না, আমি এখন এটি পেয়েছি। অফসেটটি ঘটনার # টির ভিত্তিতে স্কেল করা দরকার needs প্রতিবার যদি প্রতিস্থাপনের প্রয়োজন হয় আপনি যদি 2 টি অক্ষর হারাচ্ছেন তবে পরামিতিগুলি অপসারণ পদ্ধতিতে
গণনার

0
Regex.Replace(strInput, strToken.Replace("$", "[$]"), strReplaceWith, RegexOptions.IgnoreCase);

3
এটি কাজ করে না। $ টোকেনে নেই। এটি স্ট্রিং উইথ স্ট্রিং-এ রয়েছে।
আহেহো

9
এবং আপনি কি এটির জন্য মানিয়ে নিতে পারবেন না?
জোয়েল কোহর্ন

18
এই সাইটটি সঠিক উত্তরের জন্য একটি সংগ্রহস্থল বলে মনে করা হচ্ছে। প্রায় সঠিক যে উত্তর নেই।
আহেহো

0

নিয়মিত অভিব্যক্তি পদ্ধতিতে কাজ করা উচিত। তবে আপনি যা করতে পারেন তা হ'ল ডাটাবেস থেকে স্ট্রিং নিম্নতর, আপনার%% ভেরিয়েবল% কম রয়েছে এবং তারপরে ডাটাবেস থেকে নিম্ন কেসিং স্ট্রিংয়ের অবস্থান এবং দৈর্ঘ্য সনাক্ত করুন। মনে রাখবেন, স্ট্রিংয়ের অবস্থানগুলি কেবল তার নিম্ন কেসডের কারণে পরিবর্তিত হয় না।

তারপরে বিপরীত দিকে চলে এমন একটি লুপ ব্যবহার করে (এটি সহজ, আপনি যদি না করেন তবে পরবর্তী পয়েন্টগুলি কোথায় চলে যায় তার চলমান গণনা রাখতে হবে) ডাটাবেস থেকে আপনার নন-লোয়ার কেসড স্ট্রিং থেকে% ভেরিয়েবল% তাদের অবস্থানের দ্বারা মুছে ফেলুন এবং দৈর্ঘ্য এবং প্রতিস্থাপন মান সন্নিবেশ করান।


বিপরীতক্রমে, আমার অর্থ হ'ল বিপরীত অবস্থিত সন্ধান করা অবস্থানগুলি থেকে দূর থেকে স্বল্পতম পর্যন্ত, বিপরীতে ডাটাবেস থেকে স্ট্রিংকে অতিক্রম করবেন না।
cfeduke

আপনি করতে পারেন, বা আপনি কেবল রেজেক্স :) ব্যবহার করতে পারেন :)
রা

0

(যেহেতু প্রত্যেকে এটি নিয়ে শট নিচ্ছে)। এখানে আমার সংস্করণটি (নাল চেক সহ, এবং সঠিক ইনপুট এবং প্রতিস্থাপনের মাধ্যমে পালিয়ে যাওয়া) ** ইন্টারনেট এবং অন্যান্য সংস্করণগুলি থেকে অনুপ্রাণিত:

using System;
using System.Text.RegularExpressions;

public static class MyExtensions {
    public static string ReplaceIgnoreCase(this string search, string find, string replace) {
        return Regex.Replace(search ?? "", Regex.Escape(find ?? ""), (replace ?? "").Replace("$", "$$"), RegexOptions.IgnoreCase);          
    }
}

ব্যবহার:

var result = "This is a test".ReplaceIgnoreCase("IS", "was");

0

আমাকে আমার কেস তৈরি করুন এবং তারপরে আপনি পছন্দ করেন তবে আমাকে ছিঁড়ে ফেলতে পারেন।

তুলনামূলকভাবে কথা বলা - খুব ধীর এবং স্মৃতি ক্ষুধার্ত - রেজেক্স এই সমস্যার উত্তর নয়।

স্ট্রিংবিল্ডার স্ট্রিং ম্যাংলিংয়ের চেয়ে অনেক ভাল।

যেহেতু এটি পরিপূরক করার জন্য একটি এক্সটেনশন পদ্ধতি হবে string.Replace, তাই আমি বিশ্বাস করি যে এটি কীভাবে কাজ করে তা মিলানো গুরুত্বপূর্ণ - সুতরাং একই যুক্তির ইস্যুগুলির জন্য ব্যতিক্রম ছুঁড়ে দেওয়া গুরুত্বপূর্ণ কারণ কোনও প্রতিস্থাপন না করা থাকলে মূল স্ট্রিং ফিরিয়ে দেওয়া হয়।

আমি বিশ্বাস করি যে একটি স্ট্রিংকোম্পিয়ারি প্যারামিটার থাকা ভাল ধারণা নয়। আমি চেষ্টা করেছিলাম কিন্তু মাইকেল-লিউ দ্বারা বর্ণিত পরীক্ষার কেসটি একটি সমস্যা দেখিয়েছিল: -

[TestCase("œ", "oe", "", StringComparison.InvariantCultureIgnoreCase, Result = "")]

সূচকগুলি মিলবে, উত্সের স্ট্রিং (1) এবং ওল্ডভ্যালু.লাইনথ (2) এর ম্যাচের দৈর্ঘ্যের মধ্যে একটি মিল নেই। পুরানোভ্যালু.লেন্থকে বর্তমান ম্যাচের অবস্থানে যুক্ত করা হয়েছিল এবং আমি এর আশেপাশে কোনও উপায় খুঁজে পাইনি This রেজেেক্স যেভাবেই কেসের সাথে ম্যাচ করতে ব্যর্থ হয়েছে, তাই আমি কেবল ব্যবহারের ব্যবহারিক সমাধান নিয়েছিStringComparison.OrdinalIgnoreCase আমার সমাধানের জন্য নিয়েছি।

আমার কোডটি অন্যান্য উত্তরের মতো তবে আমার টুইস্টটি হ'ল আমি কোনও তৈরির সমস্যায় যাওয়ার আগে কোনও ম্যাচের জন্য সন্ধান করি StringBuilder। যদি কোনওটি পাওয়া না যায় তবে সম্ভাব্য পরিমাণে বড় বরাদ্দ এড়ানো যায়। কোডটি তখন একটি do{...}whileপরিবর্তে পরিবর্তিত হয়while{...}

আমি অন্যান্য উত্তরের বিরুদ্ধে কিছু বিস্তৃত পরীক্ষা করেছি এবং এটি ভগ্নাংশে দ্রুত বেরিয়ে এসেছিল এবং কিছুটা কম স্মৃতি ব্যবহার করেছি।

    public static string ReplaceCaseInsensitive(this string str, string oldValue, string newValue)
    {
        if (str == null) throw new ArgumentNullException(nameof(str));
        if (oldValue == null) throw new ArgumentNullException(nameof(oldValue));
        if (oldValue.Length == 0) throw new ArgumentException("String cannot be of zero length.", nameof(oldValue));

        var position = str.IndexOf(oldValue, 0, StringComparison.OrdinalIgnoreCase);
        if (position == -1) return str;

        var sb = new StringBuilder(str.Length);

        var lastPosition = 0;

        do
        {
            sb.Append(str, lastPosition, position - lastPosition);

            sb.Append(newValue);

        } while ((position = str.IndexOf(oldValue, lastPosition = position + oldValue.Length, StringComparison.OrdinalIgnoreCase)) != -1);

        sb.Append(str, lastPosition, str.Length - lastPosition);

        return sb.ToString();
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.