.NET এ স্ট্রিংয়ের * প্রথম উদাহরণটি * কীভাবে প্রতিস্থাপন করব?


108

আমি একটি নির্দিষ্ট স্ট্রিংয়ে প্রথম ঘটনাটি প্রতিস্থাপন করতে চাই।

আমি কিভাবে নেট থেকে এটি সম্পাদন করতে পারি?


লোকেরা বুঝতে পারে এমন পরিষ্কার পোস্ট করুন। আমি এটি আপনার জন্যও সম্পাদনা করেছি। আপনার এখানে একটি ভাষা নির্দিষ্ট করা উচিত ছিল।
জিওচেট

অবশ্যই, এটি কখনও প্রতিস্থাপন করা হয়নি ... এটি সর্বদা নতুন স্ট্রিং যা প্রতিস্থাপন পাঠ্যের সাথে মূলটি ধারণ করে। এর কারণ স্ট্রিং অপরিবর্তনীয়।
পাবলো মারাম্বিও

আমি `স্ট্রিং.পরিবর্তন ()` পদ্ধতিটি চেষ্টা করেছি। তবে এটি "এক্সকিউ" দিয়ে সমস্ত "এএ" প্রতিস্থাপন করে
থোরিন ওকেনশিল্ড

2
এই প্রশ্নটি - stackoverflow.com/questions/141045/… - আপনাকে কী করা উচিত তা সম্পর্কে সমস্ত কিছু প্রকাশ করে
stack72

1
দ্রষ্টব্য: অনুরূপ অন্য একটি প্রশ্নের সাথে মার্জ করা যা "এএ" => "এক্সকিউ" ব্যবহার / প্রতিস্থাপনের উদাহরণ হিসাবে ব্যবহার করেছে।
মার্ক গ্র্যাভেল

উত্তর:


133
string ReplaceFirst(string text, string search, string replace)
{
  int pos = text.IndexOf(search);
  if (pos < 0)
  {
    return text;
  }
  return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}

উদাহরণ:

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

সম্পাদনা : @itsmatt হিসাবে উল্লিখিত হয়েছে , Regex.Replace (স্ট্রিং, স্ট্রিং, ইন্ট 32) রয়েছে, যা একই কাজ করতে পারে তবে রানটাইমের সময় সম্ভবত এটি আরও ব্যয়বহুল, কারণ এটি একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত পার্সার ব্যবহার করছে যেখানে আমার পদ্ধতিটি খুঁজে পায় এবং তিনটি স্ট্রিং রয়েছে concatenations।

সম্পাদনা 2 : এটি যদি একটি সাধারণ কাজ হয় তবে আপনি পদ্ধতিটিকে একটি এক্সটেনশন পদ্ধতি করতে চাইতে পারেন:

public static class StringExtension
{
  public static string ReplaceFirst(this string text, string search, string replace)
  {
     // ...same as above...
  }
}

উপরের উদাহরণ ব্যবহার করে এখন এটি লেখা সম্ভব:

str = str.ReplaceFirst("brown", "quick");

2
মজার, আপনি রানটাইম সময়ে রেগেক্স পদ্ধতির আরও ব্যয়বহুল হওয়া সম্পর্কে আপনার ধারণা পরীক্ষা করেছেন? গতি কেমন? সম্ভবত রেজেক্স ব্যবহার করে অনুসন্ধানটি ইন্ডেক্সঅফ ব্যবহারের চেয়ে দ্রুত?
mfloryan

আমি সাবট্রিং () এর সাথে জড়িত এই পদ্ধতির উপরে সরানো () এবং সন্নিবেশ () যুক্ত জড়িত @ বিল্টইলিজার্ডের উত্তর পছন্দ করি। একজনের চেয়ে অন্যটির থেকে ভাল বলে কোনও ভিত্তি আছে কি?
জনসি

3
সাবধান: এটি ইউনিকোডের অক্ষর বা লিগচারের সংমিশ্রণে সঠিকভাবে কাজ করে না। উদাহরণস্বরূপ, ReplaceFirst("oef", "œ", "i")ভুলভাবে "if" এর পরিবর্তে "if" প্রদান করে। আরও তথ্যের জন্য এই প্রশ্নটি দেখুন ।
মাইকেল লিউ

2
রিশার্পার সতর্ক করে দিয়েছে String.IndexOf is culture specific.। আপডেট করার জন্য আরও শক্তিশালী int pos = text.IndexOf(search, StringComparison.Ordinal);
কনটাঙ্গো

64

যেমনটি এর ম্যাটমেট বলেছে রেগেক্স। তার উত্তরটি আরও সম্পূর্ণ করার জন্য প্রতিস্থাপন এটির পক্ষে একটি ভাল পছন্দ আমি একটি কোডের নমুনা দিয়ে এটি পূরণ করব:

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

এই ক্ষেত্রে 1 তে সেট করা তৃতীয় প্যারামিটার হ'ল স্ট্রিংয়ের শুরু থেকে ইনপুট স্ট্রিংয়ে আপনি প্রতিস্থাপন করতে চান এমন রেজেক্স প্যাটার্নের সংখ্যার সংখ্যা।

আমি আশা করছিলাম এটি একটি স্ট্যাটিক রেজেক্সের সাথে করা সম্ভব over পুনরায় ওভারলোডটি চাপ দিন তবে দুর্ভাগ্যক্রমে এটির জন্য আপনাকে একটি রেইজেক্স উদাহরণ প্রয়োজন।


1
এটি আক্ষরিক জন্য কাজ করে "foo", তবে আপনি new Regex(Regex.Escape("foo"))রূপক হিসাবে একটি চাইবেন "foo"
ruffin


15

"শুধুমাত্র প্রথম" অ্যাকাউন্টে নেওয়া, সম্ভবত:

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

?

বা আরও সাধারণভাবে:

public static string ReplaceFirstInstance(this string source,
    string find, string replace)
{
    int index = source.IndexOf(find);
    return index < 0 ? source : source.Substring(0, index) + replace +
         source.Substring(index + find.Length);
}

তারপর:

string output = input.ReplaceFirstInstance("AA", "XQ");

11
using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

প্রথম পাবেন Fমধ্যে InputStringএবং সঙ্গে এটি প্রতিস্থাপন R


2
আমি এটিকে ওয়ান-লাইনারে সরল করে দিয়েছিresult = (New Regex("F")).Replace(InputString, "R", 1)
সিজেবার্থ

এখানে সেরা উত্তর (সিজেবার্থের সাথে একত্রে)
টড ভ্যানস

8

সি # এক্সটেনশন পদ্ধতি যা এটি করবে:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

উপভোগ করুন


ধন্যবাদ! আমি এটি "মুছে ফেলুন" extension
pbh101

4
যদি ওল্ডভ্যালু স্ট্রিংয়ের অংশ না হয় তবে এটি ব্যর্থ হবে।
ভিভিএস


4

এবং বিবেচনার জন্য ভিবি.এনইটিও রয়েছে বলে আমি প্রস্তাব দিতে চাই:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function

4

ধরে নেওয়া যায় যে AAকেবল স্ট্রিংয়ের শুরুতে থাকলে এটি প্রতিস্থাপন করা দরকার:

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

আপনি যদি AAস্ট্রিংটি শুরু করে কিনা এটির প্রথম উপস্থিতিটি প্রতিস্থাপনের প্রয়োজন হলে মার্ক থেকে সমাধানটি নিয়ে যান।


3

এর ওভারলোডগুলির মধ্যে Regex.Replaceএকটি int"প্রতিস্থাপনের সর্বাধিক সংখ্যক বার হতে পারে" এর জন্য নেয়। স্পষ্টতই, Regex.Replaceসরল পাঠ্য প্রতিস্থাপনের জন্য ব্যবহার অতিরিক্ত ওষুধের মতো মনে হতে পারে তবে এটি অবশ্যই সংক্ষিপ্ত:

string output = (new Regex("AA")).Replace(input, "XQ", 1);


1

এই উদাহরণটি সাবস্ট্রিংগুলি বিমূর্ত করে (তবে ধীরে ধীরে) তবে এটি সম্ভবত একটি রেজিএক্সের চেয়ে অনেক দ্রুত:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];

-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.