Bagaimana cara mengganti * contoh pertama * dari string di .NET?

108

Saya ingin mengganti kejadian pertama dalam string tertentu.

Bagaimana saya bisa melakukannya di .NET?

Selamat tinggal StackExchange
sumber
Harap jelaskan postingan yang dapat dipahami orang. Saya juga mengedit yang ini untuk Anda. Anda harus menentukan bahasa setidaknya di sini.
GEOCHET
Tentu saja, ini tidak pernah diganti ... itu selalu berupa string baru yang berisi string asli dengan teks yang diganti. Ini karena string tidak dapat diubah.
Pablo Marambio
saya mencoba metode `String.Replace ()`. tetapi menggantikan semua "AA" dengan "XQ"
Thorin Oakenshield
2
pertanyaan ini - stackoverflow.com/questions/141045/… - mengungkapkan segala sesuatu tentang apa yang perlu Anda lakukan
stack72
1
Catatan: menggabungkan dengan pertanyaan serupa lainnya yang menggunakan "AA" => "XQ" sebagai contoh untuk mencari / mengganti.
Marc Gravell

Jawaban:

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

Contoh:

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

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

EDIT : Seperti yang disebutkan @itsmatt , ada juga Regex.Replace (String, String, Int32), yang dapat melakukan hal yang sama, tetapi mungkin lebih mahal saat runtime, karena ini menggunakan parser berfitur lengkap di mana metode saya melakukan satu pencarian dan tiga string rangkaian.

EDIT2 : Jika ini adalah tugas umum, Anda mungkin ingin menjadikan metode metode ekstensi:

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

Menggunakan contoh di atas sekarang mungkin untuk menulis:

str = str.ReplaceFirst("brown", "quick");
VVS
sumber
2
Menarik, apakah Anda menguji asumsi tentang pendekatan regex yang lebih mahal saat waktu proses? Bagaimana dengan kecepatan? Mungkin pencarian menggunakan Regex lebih cepat daripada menggunakan IndexOf?
mfloryan
Saya lebih suka jawaban @BilltheLizard yang melibatkan Hapus () dan Sisipkan () daripada pendekatan ini yang melibatkan Substring (). Apakah ada dasar untuk mengatakan yang satu lebih baik dari yang lain?
JohnC
3
Hati-hati: Ini tidak berfungsi dengan baik dengan Unicode yang menggabungkan karakter atau ligatur. Misalnya, ReplaceFirst("oef", "œ", "i")salah mengembalikan "ief", bukan "jika". Lihat pertanyaan ini untuk info lebih lanjut.
Michael Liu
2
ReSharper memperingatkan String.IndexOf is culture specific.. Lebih tangguh untuk diperbarui int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64

Seperti kata itsmatt , Regex. Penggantian adalah pilihan yang baik untuk ini namun untuk membuat jawabannya lebih lengkap saya akan mengisinya dengan contoh kode:

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

Parameter ketiga, set ke 1 dalam kasus ini, adalah jumlah kemunculan pola regex yang ingin Anda ganti dalam string input dari awal string.

Saya berharap ini bisa dilakukan dengan Regex statis. Ganti overload tetapi sayangnya tampaknya Anda memerlukan contoh Regex untuk melakukannya.

Wes Haggard
sumber
1
Itu berfungsi untuk literal "foo", tetapi Anda akan menginginkan new Regex(Regex.Escape("foo"))kiasan "foo".
ruffin
17

Lihatlah Regex . Ganti .

itsmatt
sumber
2
Secara khusus, Metode Regex.Replace (String, String, Int32) akan melakukan trik dan sangat ringkas.
itsmatt
15

Dengan mempertimbangkan "hanya pertama", mungkin:

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

?

Atau lebih umum:

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

Kemudian:

string output = input.ReplaceFirstInstance("AA", "XQ");
Marc Gravell
sumber
11
using System.Text.RegularExpressions;

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

akan menemukan pertama Fdi InputStringdan menggantinya dengan R.

Deenesh
sumber
2
Saya menyederhanakannya menjadi satu baris olehresult = (New Regex("F")).Replace(InputString, "R", 1)
cjbarth
Jawaban terbaik di sini (dalam hubungannya dengan cjbarth)
Todd Vance
8

Metode ekstensi C # yang akan melakukan ini:

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

Nikmati

mortenbpost
sumber
Terima kasih! Saya memodifikasi ini untuk membuat metode ekstensi "RemoveFirst" yang ... menghapus kemunculan pertama karakter dari string.
pbh101
4
Ini akan gagal jika oldValue bukan bagian dari string.
VVS
8

Dalam sintaks C #:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Bill the Lizard
sumber
4

Dan karena ada juga VB.NET yang perlu dipertimbangkan, saya ingin menawarkan:

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
Anthony Potts
sumber
4

Mengasumsikan bahwa AAhanya perlu diganti jika berada di awal string:

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

Jika Anda perlu mengganti kemunculan pertama AA, apakah string dimulai dengan itu atau tidak, gunakan solusi dari Marc.

Oded
sumber
3

Salah satu kelebihan beban Regex.Replaceadalah int"Jumlah maksimum berapa kali penggantian dapat terjadi". Jelas, menggunakan Regex.Replaceuntuk penggantian teks biasa mungkin tampak berlebihan, tapi pasti ringkas:

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

Bagi siapa pun yang tidak keberatan dengan referensi Microsoft.VisualBasic, ada ReplaceMetode :

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
Slai
sumber
1

Contoh ini memisahkan substring (tetapi lebih lambat), tetapi mungkin jauh lebih cepat daripada RegEx:

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

sumber
-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }

sumber