Aracılığıyla paylaş


C'de dize içeriğini değiştirme#

Bu makalede, var olan stringbir öğesini değiştirerek bir string oluşturmak için çeşitli teknikler gösterilmektedir. Gösterilen tüm teknikler değişikliklerin sonucunu yeni string bir nesne olarak döndürür. Özgün ve değiştirilmiş dizelerin ayrı örnekler olduğunu göstermek için, örnekler sonucu yeni bir değişkende depolar. Her örneği çalıştırdığınızda özgün string ve değiştirilmiş string olan yeniyi inceleyebilirsiniz.

Not

Bu makaledeki C# örnekleri Try.NET satır içi kod çalıştırıcısında ve oyun alanında çalıştırılır. Etkileşimli bir pencerede örnek çalıştırmak için Çalıştır düğmesini seçin. Kodu yürüttkten sonra yeniden Çalıştır'ı seçerek kodu değiştirebilir ve değiştirilen kodu çalıştırabilirsiniz. Değiştirilen kod etkileşimli pencerede çalışır veya derleme başarısız olursa, etkileşimli pencerede tüm C# derleyicisi hata iletileri görüntülenir.

Bu makalede çeşitli teknikler gösterilmiştir. Varolan metni değiştirebilirsiniz. Desenleri arayabilir ve eşleşen metni başka bir metinle değiştirebilirsiniz. Bir dizeyi karakter dizisi olarak değerlendirebilirsiniz. Boşluğu kaldıran kolaylık yöntemlerini de kullanabilirsiniz. Senaryonuza en yakın teknikleri seçin.

Metni değiştir

Aşağıdaki kod, var olan metni yerine başka bir metinle değiştirerek yeni bir dize oluşturur.

string source = "The mountains are behind the clouds today.";

// Replace one substring with another with String.Replace.
// Only exact matches are supported.
var replacement = source.Replace("mountains", "peaks");
Console.WriteLine($"The source string is <{source}>");
Console.WriteLine($"The updated string is <{replacement}>");

Yukarıdaki kod, dizelerin bu sabit özelliğini gösterir. Önceki örnekte özgün dize sourceolan öğesinin değiştirilmediğini görebilirsiniz. yöntemi, String.Replace değişiklikleri içeren yeni string bir oluşturur.

Replace yöntemi dizeleri veya tek karakterleri değiştirebilir. Her iki durumda da, aranan metnin her oluşumu değiştirilir. Aşağıdaki örnek tüm ' ' karakterlerini '_' ile değiştirir:

string source = "The mountains are behind the clouds today.";

// Replace all occurrences of one char with another.
var replacement = source.Replace(' ', '_');
Console.WriteLine(source);
Console.WriteLine(replacement);

Kaynak dize değiştirilmez ve yerine yeni bir dize döndürülür.

Boşluğu kırpma

Baştaki String.Trimveya sondaki boşlukları kaldırmak için , String.TrimStartve String.TrimEnd yöntemlerini kullanabilirsiniz. Aşağıdaki kodda her birinin bir örneği gösterilmektedir. Kaynak dize değişmez; bu yöntemler değiştirilmiş içeriklerle yeni bir dize döndürür.

// Remove trailing and leading white space.
string source = "    I'm wider than I need to be.      ";
// Store the results in a new string variable.
var trimmedResult = source.Trim();
var trimLeading = source.TrimStart();
var trimTrailing = source.TrimEnd();
Console.WriteLine($"<{source}>");
Console.WriteLine($"<{trimmedResult}>");
Console.WriteLine($"<{trimLeading}>");
Console.WriteLine($"<{trimTrailing}>");

Metni kaldır

yöntemini kullanarak String.Remove dizeden metin kaldırabilirsiniz. Bu yöntem, belirli bir dizinden başlayan bir dizi karakteri kaldırır. Aşağıdaki örnekte, bir dizeden metin kaldırmak için nasıl kullanılacağı String.IndexOf ve ardından Remove nasıl kaldırılacağı gösterilmektedir:

string source = "Many mountains are behind many clouds today.";
// Remove a substring from the middle of the string.
string toRemove = "many ";
string result = string.Empty;
int i = source.IndexOf(toRemove);
if (i >= 0)
{
    result= source.Remove(i, toRemove.Length);
}
Console.WriteLine(source);
Console.WriteLine(result);

Eşleşen desenleri değiştirme

Normal ifadeleri, metin eşleştirme desenlerini büyük olasılıkla bir desenle tanımlanan yeni metinle değiştirmek için kullanabilirsiniz. Aşağıdaki örnek, bir kaynak dizedeki bir deseni bulmak ve uygun büyük harfle değiştirmek için sınıfını kullanır System.Text.RegularExpressions.Regex . yöntemi, Regex.Replace(String, String, MatchEvaluator, RegexOptions) değiştirmenin mantığını bağımsız değişkenlerinden biri olarak sağlayan bir işlev alır. Bu örnekte bu işlev, LocalReplaceMatchCase örnek yöntemi içinde bildirilen yerel bir işlevdir . LocalReplaceMatchCase sınıfını System.Text.StringBuilder kullanarak uygun büyük harf kullanımıyla değiştirme dizesini oluşturur.

Normal ifadeler en çok bilinen metin yerine desene uygun metinleri aramak ve değiştirmek için kullanışlıdır. Daha fazla bilgi için bkz . Dizeleri arama. "the\s" arama deseni, "the" sözcüğünü ve ardından boşluk karakterini arar. Desenin bu bölümü, kaynak dizedeki "orada" ile eşleşmemesini sağlar. Normal ifade dili öğeleri hakkında daha fazla bilgi için bkz . Normal İfade Dili - Hızlı Başvuru.

string source = "The mountains are still there behind the clouds today.";

// Use Regex.Replace for more flexibility.
// Replace "the" or "The" with "many" or "Many".
// using System.Text.RegularExpressions
string replaceWith = "many ";
source = System.Text.RegularExpressions.Regex.Replace(source, "the\\s", LocalReplaceMatchCase,
    System.Text.RegularExpressions.RegexOptions.IgnoreCase);
Console.WriteLine(source);

string LocalReplaceMatchCase(System.Text.RegularExpressions.Match matchExpression)
{
    // Test whether the match is capitalized
    if (Char.IsUpper(matchExpression.Value[0]))
    {
        // Capitalize the replacement string
        System.Text.StringBuilder replacementBuilder = new System.Text.StringBuilder(replaceWith);
        replacementBuilder[0] = Char.ToUpper(replacementBuilder[0]);
        return replacementBuilder.ToString();
    }
    else
    {
        return replaceWith;
    }
}

yöntemi, StringBuilder.ToString nesnesindeki StringBuilder içeriğiyle sabit bir dize döndürür.

Tek tek karakterleri değiştirme

Bir dizeden karakter dizisi oluşturabilir, dizinin içeriğini değiştirebilir ve ardından dizinin değiştirilmiş içeriğinden yeni bir dize oluşturabilirsiniz.

Aşağıdaki örnekte, bir dizedeki karakter kümesinin nasıl değiştirildiği gösterilmektedir. İlk olarak, bir karakter dizisi oluşturmak için yöntemini kullanır String.ToCharArray() . "tilki" sözcüğünün IndexOf başlangıç dizinini bulmak için yöntemini kullanır. Sonraki üç karakter farklı bir sözcükle değiştirilir. Son olarak, güncelleştirilmiş karakter dizisinden yeni bir dize oluşturulur.

string phrase = "The quick brown fox jumps over the fence";
Console.WriteLine(phrase);

char[] phraseAsChars = phrase.ToCharArray();
int animalIndex = phrase.IndexOf("fox");
if (animalIndex != -1)
{
    phraseAsChars[animalIndex++] = 'c';
    phraseAsChars[animalIndex++] = 'a';
    phraseAsChars[animalIndex] = 't';
}

string updatedPhrase = new string(phraseAsChars);
Console.WriteLine(updatedPhrase);

Program aracılığıyla dize içeriği oluşturma

Dizeler sabit olduğundan, önceki örneklerin tümü geçici dizeler veya karakter dizileri oluşturur. Yüksek performanslı senaryolarda, bu yığın ayırmalarından kaçınmak tercih edilebilir. .NET Core, String.Create ara geçici dize ayırmalarından kaçınırken bir geri çağırma yoluyla bir dizenin karakter içeriğini program aracılığıyla doldurmanızı sağlayan bir yöntem sağlar.

// constructing a string from a char array, prefix it with some additional characters
char[] chars = { 'a', 'b', 'c', 'd', '\0' };
int length = chars.Length + 2;
string result = string.Create(length, chars, (Span<char> strContent, char[] charArray) =>
{
    strContent[0] = '0';
    strContent[1] = '1';
    for (int i = 0; i < charArray.Length; i++)
    {
        strContent[i + 2] = charArray[i];
    }
});

Console.WriteLine(result);

Sabit bir bloktaki bir dizeyi güvenli olmayan kodla değiştirebilirsiniz, ancak bir dize oluşturulduktan sonra dize içeriğini değiştirmek kesinlikle önerilmez. Bunu yapmak, öngörülemeyen yollarla işleri bozar. Örneğin, birisi sizinkiyle aynı içeriğe sahip bir dizeyi stajyer yaparsa, kopyanızı alır ve dizesini değiştirmenizi beklemez.

Ayrıca bkz.