Saya ingin mengganti kejadian pertama dalam string tertentu.
Bagaimana saya bisa melakukannya di .NET?
Saya ingin mengganti kejadian pertama dalam string tertentu.
Bagaimana saya bisa melakukannya di .NET?
Jawaban:
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");
ReplaceFirst("oef", "œ", "i")
salah mengembalikan "ief", bukan "jika". Lihat pertanyaan ini untuk info lebih lanjut.
String.IndexOf is culture specific.
. Lebih tangguh untuk diperbarui int pos = text.IndexOf(search, StringComparison.Ordinal);
.
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.
"foo"
, tetapi Anda akan menginginkan new Regex(Regex.Escape("foo"))
kiasan "foo"
.
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");
using System.Text.RegularExpressions;
RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);
akan menemukan pertama F
di InputString
dan menggantinya dengan R
.
result = (New Regex("F")).Replace(InputString, "R", 1)
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
Dalam sintaks C #:
int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
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
Bagi siapa pun yang tidak keberatan dengan referensi Microsoft.VisualBasic
, ada Replace
Metode :
string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
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];
string abc = "AAAAX1";
if(abc.IndexOf("AA") == 0)
{
abc.Remove(0, 2);
abc = "XQ" + abc;
}