方法: C# で文字列の内容を変更するHow to: Modify string contents in C#

この記事では、既存の string を変更して string を生成するためのいくつかの手法を示します。This article demonstrates several techniques to produce a string by modifying an existing string. 紹介するすべての手法で、変更の結果が string オブジェクトとして返されます。All the techniques demonstrated return the result of the modifications as a new string object. これを明確に示すため、すべての例で、新しい変数に結果を格納します。To clearly demonstrate this, the examples all store the result in a new variable. これで、それぞれの例を実行したときに、元の string と、変更から生じる string の両方を確認できます。You can then examine both the original string and the string resulting from the modification when you run each example.

注意

この記事の C# 例は、Try.NET インライン コード ランナーとプレイグラウンドで実行されます。The C# examples in this article run in the Try.NET inline code runner and playground. [実行] ボタンを選択すると、対話型ウィンドウで例が実行されます。Select the Run button to run an example in an interactive window. コードを実行したら、コードを変更し、 [実行] をもう一度選択して変更後のコードを実行できます。Once you execute the code, you can modify it and run the modified code by selecting Run again. 変更後のコードが対話型ウィンドウで実行されるか、コンパイルできなかった場合、対話型ウィンドウにすべての C# コンパイラ エラー メッセージが表示されます。The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

この記事ではいくつかの手法を示します。There are several techniques demonstrated in this article. 既存のテキストは置き換えることができます。You can replace existing text. パターンを検索して、一致するテキストを他のテキストに置き換えることができます。You can search for patterns and replace matching text with other text. 文字列は、一連の文字として扱うことができます。You can treat a string as a sequence of characters. 空白を削除する便利なメソッドも使用できます。You can also use convenience methods that remove white space. シナリオに最も近い手法を選択する必要があります。You should choose the techniques that most closely match your scenario.

テキストの置換Replace text

次のコードでは、既存のテキストを代替のテキストと置き換えることで新しい文字列が作成されます。The following code creates a new string by replacing existing text with a substitute.

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

先のコードは、文字列のこの不変プロパティを示しています。The preceding code demonstrates this immutable property of strings. 先の例では、元の文字列 source が変更されていないことがわかります。You can see in the preceding example that the original string, source, is not modified. String.Replace メソッドによって、変更を含む新しい string が生成されます。The String.Replace method creates a new string containing the modifications.

Replace メソッドは、文字列または単一の文字のどちらかを置き換えることができます。The Replace method can replace either strings or single characters. どちらの場合も、検索で見つかったすべてのテキストが置き換えられます。In both cases, every occurrence of the sought text is replaced. 次の例では、すべての ' ' の文字が '_' に置き換えられます。The following example replaces all ' ' characters with '_':

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

ソース文字列は変更されず、置き換えられた新しい文字列が返されます。The source string is unchanged, and a new string is returned with the replacement.

空白のトリミングTrim white space

String.TrimString.TrimStart、および String.TrimEnd メソッドを使用して、先頭または末尾の空白を削除することができます。You can use the String.Trim, String.TrimStart, and String.TrimEnd methods to remove any leading or trailing white space. 次のコードは、それぞれの例を示しています。The following code shows an example of each. ソース文字列は変更されません。これらのメソッドは、変更した内容を含む新しい文字列を返します。The source string does not change; these methods return a new string with the modified contents.

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

テキストの削除Remove text

String.Remove メソッドを使用して文字列からテキストを削除することができます。You can remove text from a string using the String.Remove method. このメソッドによって、特定のインデックスから始まる文字が削除されます。This method removes a number of characters starting at a specific index. 次の例は、String.IndexOf とそれに続く Remove を使用して文字列からテキストを削除する方法を示しています。The following example shows how to use String.IndexOf followed by Remove to remove text from a string:

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

一致パターンの置換Replace matching patterns

正規表現を使用すると、テキスト一致パターンを新しいテキストに置き換えることができます (パターンで定義されている場合もあります)。You can use regular expressions to replace text matching patterns with new text, possibly defined by a pattern. 次の例では、System.Text.RegularExpressions.Regex クラスを使用してソース文字列でパターンを検索し、適切な大文字と小文字に置き換えています。The following example uses the System.Text.RegularExpressions.Regex class to find a pattern in a source string and replace it with proper capitalization. Regex.Replace(String, String, MatchEvaluator, RegexOptions) メソッドは、置換のロジックをその引数の 1 つとして提供する機能を受け取ります。The Regex.Replace(String, String, MatchEvaluator, RegexOptions) method takes a function that provides the logic of the replacement as one of its arguments. この例で、関数 LocalReplaceMatchCase は、サンプル メソッド内で宣言されたローカル関数です。In this example, that function, LocalReplaceMatchCase is a local function declared inside the sample method. LocalReplaceMatchCase は、System.Text.StringBuilder クラスを使用して大文字と小文字が適切な置換文字列を作成します。LocalReplaceMatchCase uses the System.Text.StringBuilder class to build the replacement string with proper capitalization.

正規表現は、既知のテキストよりもパターンに従ったテキストを検索して置き換える場合に特に役立ちます。Regular expressions are most useful for searching and replacing text that follows a pattern, rather than known text. 詳細については、「方法: 文字列を検索する」を参照してください。See How to: search strings for more details. 検索パターン "the\s" は、単語 "the" とその後の空白文字を検索します。The search pattern, "the\s" searches for the word "the" followed by a white-space character. パターンのこの部分により、ソース文字列の "there" は一致しなくなります。That part of the pattern ensures that it doesn't match "there" in the source string. 正規表現言語要素の詳細については、「正規表現言語 - クイック リファレンス」をご覧ください。For more information on regular expression language elements, see Regular Expression Language - Quick Reference.

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

StringBuilder.ToString メソッドによって、StringBuilder オブジェクトの内容と不変の文字列が返されます。The StringBuilder.ToString method returns an immutable string with the contents in the StringBuilder object.

各文字の変更Modifying individual characters

文字列から文字配列を生成し、配列の内容を変更して、変更された配列の内容から新しい文字列を作成できます。You can produce a character array from a string, modify the contents of the array, and then create a new string from the modified contents of the array.

次の例は、文字列の文字のセットを置き換える方法を示しています。The following example shows how to replace a set of characters in a string. 最初に、ToCharArray() メソッドを使用して文字の配列が作成されます。First, it uses the ToCharArray() method to create an array of characters. IndexOf メソッドを使用して "fox" という単語の開始インデックスを検索します。It uses the IndexOf method to find the starting index of the word "fox." 次の 3 つの文字が、別の単語に置き換えられます。The next three characters are replaced with a different word. 最後に、新しい文字列が更新された文字配列から構築されます。Finally, a new string is constructed from the updated character array.

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

文字列のアンセーフな変更Unsafe modifications to string

アンセーフ コードを使用すると、文字列の作成後に "インプレース" で変更することができます。Using unsafe code, you can modify a string "in place" after it has been created. アンセーフ コードでは、コード内の特定の種類のバグが最小化されるように設計された .NET の多くの機能がバイパスされます。Unsafe code bypasses many of the features of .NET designed to minimize certain types of bugs in code. 文字列クラスは不変型として設計されているため、文字列を変更するにはアンセーフ コードを使用する必要があります。You need to use unsafe code to modify a string in place because the string class is designed as an immutable type. 一度作成されると、その値は変わりません。Once it has been created, its value does not change. アンセーフ コードでは、標準の string メソッドを使用せずに string で使用されたメモリにアクセスして変更できるため、このプロパティが回避されます。Unsafe code circumvents this property by accessing and modifying the memory used by a string without using normal string methods. 次の例は、アンセーフ コードを使用して文字列をインプレース変更するような、まれな状況のために提供されています。The following example is provided for those rare situations where you want to modify a string in-place using unsafe code. この例では、fixed キーワードの使用方法を示します。The example shows how to use the fixed keyword. fixed キーワードにより、コードがアンセーフ ポインターを使用してメモリにアクセスしている間、ガベージ コレクター (GC) でメモリ内の文字列オブジェクトが移動しなくなります。The fixed keyword prevents the garbage collector (GC) from moving the string object in memory while code accesses the memory using the unsafe pointer. また、文字列に対してアンセーフ操作を実行すると発生する可能性のある副作用を示します。この副作用の原因は、C# コンパイラが文字列を内部に格納する (保持する) 方法にあります。It also demonstrates one possible side effect of unsafe operations on strings that results from the way that the C# compiler stores (interns) strings internally. 通常、この方法は、特に必要な場合以外は使用しないでください。In general, you shouldn't use this technique unless it is absolutely necessary. unsafefixed についての詳細を各記事でご確認ください。You can learn more in the articles on unsafe and fixed. Intern の API 参照には文字列インターンの情報も含まれています。The API reference for Intern includes information on string interning.

unsafe
{
    // Compiler will store (intern) 
    // these strings in same location.
    string helloOne = "Hello";
    string helloTwo = "Hello";

    // Change one string using unsafe code.
    fixed (char* p = helloOne)
    {
        p[0] = 'C';
    }

    //  Both strings have changed.
    Console.WriteLine(helloOne);
    Console.WriteLine(helloTwo);
}

GitHub リポジトリのコードを見て、これらのサンプルを試すことができます。You can try these samples by looking at the code in our GitHub repository. または、サンプルを zip ファイルとしてダウンロードすることができます。Or you can download the samples as a zip file.

関連項目See also