Belirli bir dizedeki ilk geçtiği yeri değiştirmek istiyorum.
Bunu .NET'te nasıl başarabilirim?
Belirli bir dizedeki ilk geçtiği yeri değiştirmek istiyorum.
Bunu .NET'te nasıl başarabilirim?
Yanıtlar:
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);
}
Misal:
string str = "The brown brown fox jumps over the lazy dog";
str = ReplaceFirst(str, "brown", "quick");
DÜZENLEME : @itsmatt'ın bahsettiği gibi , aynı şeyi yapabilen, ancak muhtemelen çalışma zamanında daha pahalı olan Regex.Replace (String, String, Int32) var, çünkü yöntemimin bir bulduğu ve üç dizeyi yaptığı tam özellikli bir ayrıştırıcı kullanıyor birleştirmeler.
DÜZENLEME2 : Bu yaygın bir görevse, yöntemi bir uzantı yöntemi yapmak isteyebilirsiniz:
public static class StringExtension
{
public static string ReplaceFirst(this string text, string search, string replace)
{
// ...same as above...
}
}
Yukarıdaki örneği kullanarak artık yazmak mümkün:
str = str.ReplaceFirst("brown", "quick");
ReplaceFirst("oef", "œ", "i")
"if" yerine hatalı olarak "ief" döndürür. Daha fazla bilgi için bu soruya bakın .
String.IndexOf is culture specific.
. Güncellemek için daha sağlam int pos = text.IndexOf(search, StringComparison.Ordinal);
.
Gibi itsmatt söyledi Regex.Replace Bir kod örneği ile bunu dolduracaktır bunun için iyi bir seçim ancak onun cevabı daha eksiksiz hale getirmektir:
using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);
// result = "bar1 foo2 foo3 foo4"
Bu durumda 1 olarak ayarlanan üçüncü parametre, dizenin başından itibaren girdi dizesinde değiştirmek istediğiniz normal ifade kalıbının oluşum sayısıdır.
Bu statik ile yapılabilir diye umuyordum Regex.Replace aşırı ama ne yazık ki bunu gerçekleştirmek için bir Regex örneğini ihtiyaç belirir.
"foo"
, ancak new Regex(Regex.Escape("foo"))
mecazi için bir isteyeceksiniz "foo"
.
"Yalnızca ilk" i hesaba katarsak, belki:
int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
input.Substring(index + 2);
?
Veya daha genel olarak:
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);
}
Sonra:
string output = input.ReplaceFirstInstance("AA", "XQ");
using System.Text.RegularExpressions;
RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);
ilk F
içinde bulacak InputString
ve ile değiştirecektir R
.
result = (New Regex("F")).Replace(InputString, "R", 1)
Bunu yapacak C # uzatma yöntemi:
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);
}
}
Zevk almak
C # sözdiziminde:
int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
Ayrıca dikkate alınması gereken VB.NET de olduğu için şunları sunmak isterim:
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
Bir referansa aldırış etmeyenlerMicrosoft.VisualBasic
için Replace
Yöntem var :
string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
Bu örnek, alt dizeleri özetler (ancak daha yavaştır), ancak muhtemelen bir Normal İfadeden çok daha hızlıdır:
var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];
Span
Yeni dize oluşumunu en aza indirmek için kullanılan güncellenmiş uzantı yöntemi
public static string ReplaceFirstOccurrence(this string source, string search, string replace) {
int index = source.IndexOf(search);
if (index < 0) return source;
var sourceSpan = source.AsSpan();
return string.Concat(sourceSpan.Slice(0, index), replace, sourceSpan.Slice(index + search.Length));
}
string abc = "AAAAX1";
if(abc.IndexOf("AA") == 0)
{
abc.Remove(0, 2);
abc = "XQ" + abc;
}